2011-06-17 115 views
4

我有一個由「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」。如何做到這一點的建議?

+0

可能相關:[變換載體導入列表](http://stackoverflow.com/questions/5174144/transform-vector-into-list) – 2011-06-17 13:26:31

回答

3

有一定更好的方法,但是:

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

謝謝,尼克。這有助於我瞭解「哪個」。 – 2011-06-17 13:52:11

3

摺疊成一個字符串,然後分裂的 「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如果這不是你想要的。)

7

您可以使用cumsumsplit的組合來做到這一點與單襯墊:

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="")) 
+3

使用`cumsum`和`split`的非常優雅的解決方案+1 – Ramnath 2011-06-17 13:45:30