2012-07-23 10 views
17

मैं इस तरह के रूप में एक स्ट्रिंग है:एक स्ट्रिंग को किसी दिए गए लंबाई के सबस्ट्रिंग में कैसे विभाजित करें?

"aabbccccdd"

मैं लंबाई 2 की सबस्ट्रिंग एक वेक्टर में इस स्ट्रिंग को तोड़ने के लिए चाहते हैं: एक ही रास्ता

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

उत्तर

38

यहाँ है

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 
+0

दिलचस्प, 'substring' के बारे में पता नहीं था। 'Substr' के बाद से बहुत अच्छा है प्रारंभ/अंत के लिए वेक्टर तर्क नहीं लेता है। –

+2

शानदार! दूसरा संस्करण वास्तव में वास्तव में तेज़ है! – MadSeb

+0

मैं सोच रहा था कि ऐसा कुछ ऐसा था जो "babbb ccccc dd में" aabbbcccccdd "को विभाजित करेगा, इस समय मैं grepexpr का उपयोग करता हूं। – jackStinger

8
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" 
1

एक देता वर्ण समूह के लिए एक मैट्रिक्स का उपयोग कर सकते हैं:

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] 

अधिक दुर्भाग्यपूर्ण है कि g1 और g2 @GSee से चुपचाप अजीब स्ट्रिंग की लंबाई की एक इनपुट के लिए गलत परिणाम वापस:

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

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

अजीब स्ट्रिंग की लंबाई की एक इनपुट के लिए टूट जाता है, एक चेतावनी दे रही है एस 2 की भावना में कार्य है, प्रत्येक समूह में वर्णों की संख्या के लिए पैरामीटर लेना, और यदि आवश्यक हो तो अंतिम प्रविष्टि को छोड़ दें:

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" 

(यह वास्तव में g2 की तुलना में धीमी है, लेकिन 7 का एक पहलू के बारे में द्वारा g1 तुलना में तेजी से)

+0

द्वारा विभाजित है या नहीं, यदि पात्रों की एक विषम संख्या हो सकती है, तो ऐसा लगता है कि तथ्य के बाद इसे संभालना तेज़ होगा 'लागू' लूप पेश करने के लिए। मुझे यकीन है कि यह तेज़ है: 'बाहर <- जी 2 (एक्स); अगर (nchar (x) %% 2 == 1L) बाहर [लंबाई (बाहर)] <- substring (बाहर [लंबाई (बाहर)], 1, 1); out' – GSee

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 AAT एएए जी

5

वहाँ दो हैं आसान संभावनाएं:

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" 
    
संबंधित मुद्दे