【问题标题】:Filtering data in R在 R 中过滤数据
【发布时间】:2010-10-03 08:48:30
【问题描述】:

我有一个 CSV 数据文件,我可以使用 read.csv() 在 R 中加载它

一些数据丢失了,所以我想将数据框减少到完全由非缺失数据组成的集合,即如果NULL 出现在任何地方,我想从过滤中排除该列和行数据集。

我知道我可以通过内置的 R 向量操作相当简单地做到这一点,但我不太确定如何准确地做到这一点?

为了让我的问题更具体一点,这里是数据的快速示例,以便您了解我想要做什么。

DocID       Anno1    Anno7  Anno8
1           7        NULL   8
2           8        NULL   3
44          10       2      3
45          6        6      6
46          1        3      4
49          3        8      5
62          4        NULL   9
63          2        NULL   4
67          11       NULL   3
91          NULL     9      7
92          NULL     7      5
93          NULL     8      8

因此,鉴于此输入,我需要一些将输出减少到此的代码。

DocID       Anno8
44          3
45          6
46          4
49          5

因为Anno8是唯一的非NULL数据列,非NULL数据只有四行。

【问题讨论】:

    标签: r filtering


    【解决方案1】:

    另外,如果x 是您的数据框,您可以使用sqldf 库来完成:

    library(sqldf)
    result <- sqldf("SELECT DocID, Anno8 FROM x
                     WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
    

    【讨论】:

      【解决方案2】:
      a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1))
      
      na.omit(a)
        a b c
      2 2 1 4
      4 1 1 1
      
      a[rowSums(is.na(a))==0,]
        a b c
      2 2 1 4
      4 1 1 1
      
      a[complete.cases(a),]
        a b c
      2 2 1 4
      4 1 1 1
      

      【讨论】:

      • 我不明白这个答案。这将始终只返回一行
      【解决方案3】:

      如果x 是你的data.frame(或matrix)那么

      x[ ,apply(x, 2, function(z) !any(is.na(z)))]
      

      由于您的示例使用NULL,因此is.na(·) 将替换为is.null(·)

      您也可以查看subset(·)

      【讨论】:

      • 谢谢@rguha,这很有用。如果我想在 csv 的特定列中删除任何小于 5 的值,这将如何工作?
      • @Rodolphe 删除 sales 列中小于 5 的任何值:data[data$sales &gt;= 5, ] 更直接
      【解决方案4】:

      您可以使用 na.omit() 删除任何包含缺失的行,但这不是您想要的。此外,目前接受的答案是错误的。它为您提供完整的列,但不会删除具有一个或多个缺失值的行,这是所要求的。正确答案可以为:

      > a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4))
      > a
        a  b c
      1 1 NA 3
      2 2  1 4
      > na.omit(a)[,colSums(is.na(a))==0]
        a c
      2 2 4
      

      看上面的答案是错误的:

      > a[ ,apply(a, 2, function(z) !any(is.na(z)))]
        a c
      1 1 3
      2 2 4
      

      由于第 2 列中的 NA,应删除第 1 行。

      【讨论】:

        猜你喜欢
        • 2020-05-10
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 2012-02-12
        • 2021-08-18
        • 1970-01-01
        • 2017-01-03
        • 1970-01-01
        相关资源
        最近更新 更多