【问题标题】:how to split a vector by repeated occurrences of NAs如何通过重复出现的 NA 来拆分向量
【发布时间】:2017-03-22 02:34:42
【问题描述】:

我希望能够定义一个函数,该函数将在每次存在已重复 n 次的 NA(或其他用户定义的分隔符)时拆分向量。形式:

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?,它适用于单个实例,但找不到适用于重复实例的任何东西。

【问题讨论】:

  • n=2 结果是什么?连续的NAs 必须完全是2>=2

标签: r


【解决方案1】:

我们可以从base R 使用rle。通过在逻辑向量上应用rle,创建valueslengthslist。创建另一个索引 ('i1') 基于 lengths as 3 和 values TRUE, split 'vec' 通过创建基于 'i1' 的分组变量,然后删除每个末尾的 NA 元素list元素

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)

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多