2011-06-17 56 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