我有一個由「Y」和「N」組成的向量x。分割矢量
> x
[1] Y N N N N N N N N N N Y N N N N
我想這個分成
> x1
[1] Y N N N N N N N N N N
和
> x2
[1] Y N N N N
這些矢量始終以 「Y」 開始之前下一個「採取一切 」N「 S Y」。如何做到這一點的建議?
我有一個由「Y」和「N」組成的向量x。分割矢量
> x
[1] Y N N N N N N N N N N Y N N N N
我想這個分成
> x1
[1] Y N N N N N N N N N N
和
> x2
[1] Y N N N N
這些矢量始終以 「Y」 開始之前下一個「採取一切 」N「 S Y」。如何做到這一點的建議?
有一定更好的方法,但是:
tst<-c("Y", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "Y", "N", "N", "N", "N")
starts<-which(tst=="Y") #where are the "Y"
ends<-c(starts[-1]-1, length(tst)) #pos before each "Y""
lapply(seq_along(starts), function(i){tst[(starts[i]):(ends[i])]}) #parts from each start till each end
謝謝,尼克。這有助於我瞭解「哪個」。 – 2011-06-17 13:52:11
摺疊成一個字符串,然後分裂的 「Y」 S。
x <- c("Y", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "Y", "N", "N", "N", "N")
y <- paste(x, collapse = "")
z <- paste("Y", strsplit(pn, "Y")[[1]], sep = "")[-1]
z
或者使用運行長度編碼。
n <- rle(x)$lengths[c(FALSE, TRUE)]
lapply(n, function(i) paste("Y", rep.int("N", i), sep = "", collapse = ""))
(這會給你一個列表,而不是一個向量,使用unlist
如果這不是你想要的。)
您可以使用cumsum
和split
的組合來做到這一點與單襯墊:
x <- c("Y","N","N","N","N","N","N","N","N","N","N","Y","N","N","N","N")
v <- split(x,paste("x",cumsum(x=="Y"),sep=""))
使用`cumsum`和`split`的非常優雅的解決方案+1 – Ramnath 2011-06-17 13:45:30
可能相關:[變換載體導入列表](http://stackoverflow.com/questions/5174144/transform-vector-into-list) – 2011-06-17 13:26:31