我有一个由“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