gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:33:14 25 4
gpt4 key购买 nike

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

  • 如果 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com