r - 根据行内 NA 的数量有条件地删除行

标签 r list na

我希望根据以下两个条件从我的数据集中删除行:

  • 如果 3 个连续的单元格是 NA
  • ,则删除行
  • 如果有四个或更多单元格 NA

  • 我的样本数据:
    data <- rbind(c(1,1,2,3,4,2,3,2),
                  c(NA,1, NA, 4,1,1,NA,2), 
                  c(1,4,6,7,3,1,2,2), 
                  c(NA,3, NA, 1,NA,2,NA,NA), 
                  c(1,4, NA, NA,NA,4,3,2))
    

    我在现有问题中进行了研究,发现 na.omitcomplete.cases 可以删除带有 NA 的行,但由于我有条件,做进一步研究,我在现有问题中发现了以下代码:
    data[! rowSums(is.na(data)) >4  , ]   
    data[! rowSums(is.na(data)) ==3  , ]
    

    第一行完全满足我的第二个条件。第二行确实删除了三个 NA 的行,但不寻找连续的行,并删除了总共 3 个 NA 的行。例如:
    > data
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    1    2    3    4    2    3    2
    [2,]   NA    1   NA    4    1    1   NA    2
    [3,]    1    4    6    7    3    1    2    2
    [4,]   NA    3   NA    1   NA    2   NA   NA
    [5,]    1    4   NA   NA   NA    4    3    2
    
    > data[! rowSums(is.na(data)) ==3  , ]
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    1    2    3    4    2    3    2
    [2,]    1    4    6    7    3    1    2    2
    [3,]   NA    3   NA    1   NA    2   NA   NA
    

    我真正想要的是删除第 5 行,因为它有三个连续的 NA 而不是第 2 行。

    任何人都可以请教我如何克服这个问题?

    最佳答案

    同时满足两个条件:

    data[!apply(is.na(data), 1, function(x) 
      {v <- cumsum(x); any(diff(v, 3) == 3) | 4 %in% v}), ]
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    # [1,]    1    1    2    3    4    2    3    2
    # [2,]   NA    1   NA    4    1    1   NA    2
    # [3,]    1    4    6    7    3    1    2    2
    
    any(diff(v, 3) == 3)TRUE 如果 NA 连续出现 3 次(所以某处的差异是 3),而 4 %in% v 对应于第二个条件。

    关于r - 根据行内 NA 的数量有条件地删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15186697/

    相关文章:

    php - 在 googleVis 图表中将特殊字符转换为 utf-8

    r - 为什么我无法安装 XML 包

    python - 垂直或水平计数列表列表中的值 "in a row"

    python - 查找列表中最常见的元素

    r - 为什么在将 NA 值附加到带有因子的数据帧时,R 会更改变量类型?

    r - 为什么Ifelse无法取代NA?

    r - 如何撤消 data.table 中的 setkey 排序?

    r - 遍历基于 tidyverse/rlang 的函数的输入值

    java - 如何打印没有方括号的列表?

    r - 按行选择第一个非 NA 值