【问题标题】:Conditional row removal based on number of NA's within the row基于行内 NA 的数量的条件行删除
【发布时间】:2014-01-20 17:44:49
【问题描述】:

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

  1. 如果 3 个连续单元格为 NA
  2. ,则删除行
  3. 如果四个或更多单元格是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 行。

谁能告诉我如何克服这个问题?

【问题讨论】:

    标签: r list na


    【解决方案1】:

    同时满足两个条件:

    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),4 %in% v 对应第二个条件。

    【讨论】:

    • 这真的符合我的目的,也将帮助我在未来申请其他条件!太感谢了!问候,
    【解决方案2】:

    不是美女,但它会起作用:

    rle.na <- apply(is.na(data), 1, function(z){
      tmp <- rle(z)
      tmp$lengths[tmp$values]
    })
    data[!sapply(rle.na, function(z) any(z == 3)) | rowSums(is.na(data)) > 4, ]
    

    【讨论】:

    • 嗨,非常感谢,这对我来说非常有效!亲切的问候,阿扬
    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多