如何通过重复出现的NA来分割矢量

时间:2017-03-22 02:34:42

标签: r

我希望能够定义一个函数,每当有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?,它适用于单个实例,但却找不到任何可用于重复实例的内容。

1 个答案:

答案 0 :(得分:4)

我们可以使用rle中的base R。通过在逻辑向量上应用list来创建values lengthsrle。创建另一个索引(' 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)