我希望能够定义一个函数,每当有N次(或其他用户定义的分隔符)重复n次时,它将分割矢量。形式如下:
na.split = function(vec, n, sep = NA)
其中vector是用于分割的向量,n是定义分割的NA的数量,sep是定义的分隔符(默认为NA)。
例如,使用这样的矢量:
vec = c(1, 2, NA, 4, 5, NA, NA, NA, 3, 2, NA, NA, NA, 1, NA, NA 2)
输出将是一个向量列表,例如n = 3:
vec1 = c(1, 2, NA, 4, 5), vec2 = c(3, 2), vec3 = c(1, NA, NA, 2)
我见过一个类似的问题How to split a vector by delimiter?,它适用于单个实例,但却找不到任何可用于重复实例的内容。
答案 0 :(得分:4)
我们可以使用rle
中的base R
。通过在逻辑向量上应用list
来创建values
lengths
和rle
。创建另一个索引(' i1'),基于lengths
为3,values
为真,split
' vec'通过创建基于' i1'的分组变量然后删除每个list
元素末尾的NA元素
rl <- rle(is.na(vec))
i1 <- rl$lengths==3 & rl$values
lst <- split(vec, rep(cumsum(c(TRUE, i1[-length(i1)])), rl$lengths))
lapply(lst, function(x) x[seq_len(tail(which(!is.na(x)), 1))])
#$`1`
#[1] 1 2 NA 4 5
#$`2`
#[1] 3 2
#$`3`
#[1] 1 NA NA 2
vec <- c(1, 2, NA, 4, 5, NA, NA, NA, 3, 2, NA, NA, NA, 1, NA, NA, 2)