35

私は次のような文字列を持っています:

"aabbccccdd"

この文字列を長さ2の部分文字列のベクトルに分割したい:

"aa" "bb" "cc" "cc" "dd"

4

5 に答える 5

61

これが1つの方法です

substring("aabbccccdd", seq(1, 9, 2), seq(2, 10, 2))
#[1] "aa" "bb" "cc" "cc" "dd"

またはより一般的に

text <- "aabbccccdd"
substring(text, seq(1, nchar(text)-1, 2), seq(2, nchar(text), 2))
#[1] "aa" "bb" "cc" "cc" "dd"

編集:これははるかに高速です

sst <- strsplit(text, "")[[1]]
out <- paste0(sst[c(TRUE, FALSE)], sst[c(FALSE, TRUE)])

最初に文字列を文字に分割します。次に、偶数要素と奇数要素を一緒に貼り付けます。

タイミング

text <- paste(rep(paste0(letters, letters), 1000), collapse="")
g1 <- function(text) {
    substring(text, seq(1, nchar(text)-1, 2), seq(2, nchar(text), 2))
}
g2 <- function(text) {
    sst <- strsplit(text, "")[[1]]
    paste0(sst[c(TRUE, FALSE)], sst[c(FALSE, TRUE)])
}
identical(g1(text), g2(text))
#[1] TRUE
library(rbenchmark)
benchmark(g1=g1(text), g2=g2(text))
#  test replications elapsed relative user.self sys.self user.child sys.child
#1   g1          100  95.451 79.87531    95.438        0          0         0
#2   g2          100   1.195  1.00000     1.196        0          0         0
于 2012-07-23T20:05:12.650 に答える
16

2つの簡単な可能性があります:

s <- "aabbccccdd"
  1. gregexprおよびregmatches

    regmatches(s, gregexpr(".{2}", s))[[1]]
    # [1] "aa" "bb" "cc" "cc" "dd"
    
  2. strsplit

    strsplit(s, "(?<=.{2})", perl = TRUE)[[1]]
    # [1] "aa" "bb" "cc" "cc" "dd"
    
于 2014-04-24T07:38:39.003 に答える
12
string <- "aabbccccdd"
# total length of string
num.chars <- nchar(string)

# the indices where each substr will start
starts <- seq(1,num.chars, by=2)

# chop it up
sapply(starts, function(ii) {
  substr(string, ii, ii+1)
})

これは

[1] "aa" "bb" "cc" "cc" "dd"
于 2012-07-23T20:09:11.177 に答える
2

マトリックスを使用して文字をグループ化できます。

s2 <- function(x) {
  m <- matrix(strsplit(x, '')[[1]], nrow=2)
  apply(m, 2, paste, collapse='')
}

s2('aabbccddeeff')
## [1] "aa" "bb" "cc" "dd" "ee" "ff"

残念ながら、これは奇数の文字列長の入力で中断し、警告を出します。

s2('abc')
## [1] "ab" "ca"
## Warning message:
## In matrix(strsplit(x, "")[[1]], nrow = 2) :
##   data length [3] is not a sub-multiple or multiple of the number of rows [2]

さらに残念なことに、@ GSeeからはg1g2奇数の文字列長の入力に対して誤った結果がサイレントに返されます。

g1('abc')
## [1] "ab"

g2('abc')
## [1] "ab" "cb"

これはs2の精神に基づく関数であり、各グループの文字数のパラメーターを取り、必要に応じて最後のエントリを短くします。

s <- function(x, n) {
  sst <- strsplit(x, '')[[1]]
  m <- matrix('', nrow=n, ncol=(length(sst)+n-1)%/%n)
  m[seq_along(sst)] <- sst
  apply(m, 2, paste, collapse='')
}

s('hello world', 2)
## [1] "he" "ll" "o " "wo" "rl" "d" 
s('hello world', 3)
## [1] "hel" "lo " "wor" "ld" 

(実際にはより遅いですが、約7倍g2より速くなります)g1

于 2013-02-18T17:44:59.803 に答える
1

醜いが動作する

sequenceString <- "ATGAATAAAG"

J=3#maximum sequence length in file
sequenceSmallVecStart <-
  substring(sequenceString, seq(1, nchar(sequenceString)-J+1, J), 
    seq(J,nchar(sequenceString), J))
sequenceSmallVecEnd <-
    substring(sequenceString, max(seq(J, nchar(sequenceString), J))+1)
sequenceSmallVec <-
    c(sequenceSmallVecStart,sequenceSmallVecEnd)
cat(sequenceSmallVec,sep = "\n")

ATG AATAAAGを提供します

于 2014-04-24T07:28:27.363 に答える