【问题标题】:How to remove rows with NAs only if they are present in more than certain percentage of columns?仅当它们存在于超过一定百分比的列中时,如何删除具有 NA 的行?
【发布时间】:2016-06-17 10:37:00
【问题描述】:

我想对以下示例数据集使用 na.omit(数据),但条件是仅当它们存在于“超过 30%”的列中时才删除具有 NA 的行。

数据:

        C1     C2     C3     C4     C5
Gene1   0.07   NA     0.05   0.07   0.07
Gene2   0.2    0.18   0.16   0.15   0.15
Gene3   NA     0.93   0.9    NA     0.92
Gene4   0.32   0.05   0.12   0.13   0.05
Gene5   0.44   0.53   0.46   0.03   0.47
Gene6   NA     0.34   NA     0.8    NA
Gene7   0.49   0.55   0.67   0.49   0.89
Gene8   0.25   NA     0.49   NA     NA
Gene9   0.1    0.1    0.05   NA     0.09

所以生成的文件应该如下:

        C1     C2     C3     C4     C5
Gene1   0.07   NA     0.05   0.07   0.07
Gene2   0.2    0.18   0.16   0.15   0.15
Gene4   0.32   0.05   0.12   0.13   0.05
Gene5   0.44   0.53   0.46   0.03   0.47
Gene7   0.49   0.55   0.67   0.49   0.89
Gene9   0.1    0.1    0.05   NA     0.09

感谢您的帮助!

【问题讨论】:

  • 您如何决定要删除哪些NA 值?
  • 嗨蒂姆,它不依赖于哪个 NA。只有当特定行的 NA 超过 30% 时,才会完全删除该行。
  • 你尝试了什么?显示一些代码。

标签: r na


【解决方案1】:

您可以根据 NA 值的行总和进行子集化:

test[!rowSums(is.na(test)) > ncol(test)*.3,]

        C1   C2   C3   C4   C5
Gene1 0.07   NA 0.05 0.07 0.07
Gene2 0.20 0.18 0.16 0.15 0.15
Gene4 0.32 0.05 0.12 0.13 0.05
Gene5 0.44 0.53 0.46 0.03 0.47
Gene7 0.49 0.55 0.67 0.49 0.89
Gene9 0.10 0.10 0.05   NA 0.09

【讨论】:

  • 我会选择dat[rowMeans(is.na(dat)) <= .3,]
【解决方案2】:

这是另一个带有Reduce的版本

df1[!Reduce(`+`, lapply(df1, is.na)) > ncol(df1)*0.3,]
#       C1   C2   C3   C4   C5
#Gene1 0.07   NA 0.05 0.07 0.07
#Gene2 0.20 0.18 0.16 0.15 0.15
#Gene4 0.32 0.05 0.12 0.13 0.05
#Gene5 0.44 0.53 0.46 0.03 0.47
#Gene7 0.49 0.55 0.67 0.49 0.89
#Gene9 0.10 0.10 0.05   NA 0.09

【讨论】:

  • dat[Reduce(+, lapply(dat, is.na))
【解决方案3】:

这里还有另一个使用 apply 的选项

dat[apply(dat,1,function(x){sum(is.na(x))/dim(dat)[2]})<0.3,]

#C1   C2   C3   C4   C5
#Gene1 0.07   NA 0.05 0.07 0.07 
#Gene2 0.20 0.18 0.16 0.15 0.15
#Gene4 0.32 0.05 0.12 0.13 0.05
#Gene5 0.44 0.53 0.46 0.03 0.47
#Gene7 0.49 0.55 0.67 0.49 0.89
#Gene9 0.10 0.10 0.05   NA 0.09

【讨论】:

    猜你喜欢
    • 2020-01-02
    • 2019-08-16
    • 2021-04-01
    • 2021-04-22
    • 2019-11-26
    • 2020-03-28
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多