मैं इस तरह के रूप में एक स्ट्रिंग है:एक स्ट्रिंग को किसी दिए गए लंबाई के सबस्ट्रिंग में कैसे विभाजित करें?
"aabbccccdd"
मैं लंबाई 2 की सबस्ट्रिंग एक वेक्टर में इस स्ट्रिंग को तोड़ने के लिए चाहते हैं: एक ही रास्ता
"aa" "bb" "cc" "cc" "dd"
मैं इस तरह के रूप में एक स्ट्रिंग है:एक स्ट्रिंग को किसी दिए गए लंबाई के सबस्ट्रिंग में कैसे विभाजित करें?
"aabbccccdd"
मैं लंबाई 2 की सबस्ट्रिंग एक वेक्टर में इस स्ट्रिंग को तोड़ने के लिए चाहते हैं: एक ही रास्ता
"aa" "bb" "cc" "cc" "dd"
यहाँ है
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
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"
एक देता वर्ण समूह के लिए एक मैट्रिक्स का उपयोग कर सकते हैं:
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
तुलना में तेजी से)
द्वारा विभाजित है या नहीं, यदि पात्रों की एक विषम संख्या हो सकती है, तो ऐसा लगता है कि तथ्य के बाद इसे संभालना तेज़ होगा 'लागू' लूप पेश करने के लिए। मुझे यकीन है कि यह तेज़ है: 'बाहर <- जी 2 (एक्स); अगर (nchar (x) %% 2 == 1L) बाहर [लंबाई (बाहर)] <- substring (बाहर [लंबाई (बाहर)], 1, 1); out' – GSee
बदसूरत लेकिन काम करता है
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 एएए जी
वहाँ दो हैं आसान संभावनाएं:
s <- "aabbccccdd"
gregexpr
और regmatches
:
regmatches(s, gregexpr(".{2}", s))[[1]]
# [1] "aa" "bb" "cc" "cc" "dd"
strsplit
:
strsplit(s, "(?<=.{2})", perl = TRUE)[[1]]
# [1] "aa" "bb" "cc" "cc" "dd"
दिलचस्प, 'substring' के बारे में पता नहीं था। 'Substr' के बाद से बहुत अच्छा है प्रारंभ/अंत के लिए वेक्टर तर्क नहीं लेता है। –
शानदार! दूसरा संस्करण वास्तव में वास्तव में तेज़ है! – MadSeb
मैं सोच रहा था कि ऐसा कुछ ऐसा था जो "babbb ccccc dd में" aabbbcccccdd "को विभाजित करेगा, इस समय मैं grepexpr का उपयोग करता हूं। – jackStinger