68

文字列の特定の位置に余分な文字 (または新しい文字列) を挿入したいと考えています。たとえば、getdの 4 番目の場所に挿入したいとします。abcefgabcdefg

今私は使用しています:

old <- "abcefg"
n <- 4
paste(substr(old, 1, n-1), "d", substr(old, n, nchar(old)), sep = "")

このタスク用に 1 行の単純な関数を作成することもできますが、そのための既存の関数があるかどうかに興味があります。

4

7 に答える 7

73

これは、正規表現とで行うことができますgsub

gsub('^([a-z]{3})([a-z]+)$', '\\1d\\2', old)
# [1] "abcdefg"

これを動的に実行する場合は、次を使用して式を作成できますpaste

letter <- 'd'
lhs <- paste0('^([a-z]{', n-1, '})([a-z]+)$')
rhs <- paste0('\\1', letter, '\\2')
gsub(lhs, rhs, old)
# [1] "abcdefg"

DWinのコメントによると、これをより一般的にしたいと思うかもしれません。

gsub('^(.{3})(.*)$', '\\1d\\2', old)

このように、小文字だけでなく、任意の3文字が一致します。DWinは、subの代わりにを使用することもお勧めしgsubます。この方法では、最初のインスタンスにのみ一致する^ため、それほど心配する必要はありません。subしかし、私は正規表現で明示的に表現するのが好きで、それらを理解し、より一般性の必要性を見つけたときに、より一般的な表現にのみ移行します。


Greg Snowが指摘したように、一致の背後にある別の形式の正規表現を使用できます。

sub( '(?<=.{3})', 'd', old, perl=TRUE )

また、:ではなくgsubを使用して上記のダイナミックを構築することもできます:sprintfpaste0

lhs <- sprintf('^([a-z]{%d})([a-z]+)$', n-1) 

または彼のsub正規表現の場合:

lhs <- sprintf('(?<=.{%d})',n-1)
于 2012-12-13T16:05:42.227 に答える
8

@Justinの答えは、その柔軟性のために私が実際にこれにアプローチする方法ですが、これも楽しいアプローチになる可能性があります。

文字列を「固定幅形式」として扱い、文字を挿入する場所を指定できます。

paste(read.fwf(textConnection(old), 
               c(4, nchar(old)), as.is = TRUE), 
      collapse = "d")

sapply元の文字列が「名前」として表示されるため、を使用した場合の出力は特に優れています。

newold <- c("some", "random", "words", "strung", "together")
sapply(newold, function(x) paste(read.fwf(textConnection(x), 
                                          c(4, nchar(x)), as.is = TRUE), 
                                 collapse = "-WEE-"))
#            some          random           words          strung        together 
#   "some-WEE-NA"   "rand-WEE-om"    "word-WEE-s"   "stru-WEE-ng" "toge-WEE-ther" 
于 2012-12-13T16:18:49.243 に答える
2

substr1文字列内の文字の抽出、置換、および挿入を処理するために呼び出されるカスタム関数を作成しました。すべてのセッションの開始時にこれらのコードを実行します。お気軽に試してみて、改善が必要な場合はお知らせください。

# extraction
substr1 <- function(x,y) {
  z <- sapply(strsplit(as.character(x),''),function(w) paste(na.omit(w[y]),collapse=''))
  dim(z) <- dim(x)
  return(z) }

# substitution + insertion
`substr1<-` <- function(x,y,value) {
  names(y) <- c(value,rep('',length(y)-length(value)))
  z <- sapply(strsplit(as.character(x),''),function(w) {
    v <- seq(w)
    names(v) <- w
    paste(names(sort(c(y,v[setdiff(v,y)]))),collapse='') })
  dim(z) <- dim(x)
  return(z) }

# demonstration
abc <- 'abc'
substr1(abc,1)
# "a"
substr1(abc,c(1,3))
# "ac"
substr1(abc,-1)
# "bc"
substr1(abc,1) <- 'A'
# "Abc"
substr1(abc,1.5) <- 'A'
# "aAbc"
substr1(abc,c(0.5,2,3)) <- c('A','B')
# "AaB"
于 2017-11-15T22:19:05.203 に答える