【问题标题】:How to delete rows from a dataframe that contain n*NA如何从包含 n*NA 的数据框中删除行
【发布时间】:2013-08-09 14:12:43
【问题描述】:

我有许多包含约 10 列和约 200000 行的大型数据集。并非所有列都包含每一行的值,尽管至少一列必须包含要存在的行的值,但我想为一行中允许多少 NAs 设置一个阈值。

我的数据框看起来像这样:

 ID q  r  s  t  u  v  w  x  y  z
 A  1  5  NA 3  8  9  NA 8  6  4
 B  5  NA 4  6  1  9  7  4  9  3 
 C  NA 9  4  NA 4  8  4  NA 5  NA
 D  2  2  6  8  4  NA 3  7  1  32 

我希望能够删除包含超过 2 个包含 NA 的单元格的行来获取

ID q  r  s  t  u  v  w  x  y  z
 A 1  5  NA 3  8  9  NA 8  6  4
 B 5  NA 4  6  1  9  7  4  9  3 
 D 2  2  6  8  4  NA 3  7  1  32 

complete.cases 删除所有包含任何NA 的行,我知道可以删除某些列中包含NA 的行,但有没有办法修改它,以便不具体说明哪些列包含@ 987654327@,但是总共有多少呢?

或者,这个数据帧是通过使用合并几个数据帧来生成的

    file1<-read.delim("~/file1.txt")
    file2<-read.delim(file=args[1])

    file1<-merge(file1,file2,by="chr.pos",all=TRUE)

也许合并功能可以改变?

谢谢

【问题讨论】:

    标签: r filter merge rows na


    【解决方案1】:

    这将返回一个数据集,其中每行最多缺少两个值:

    dfrm[ apply(dfrm, 1, function(r) sum(is.na(x)) <= 2 ) , ]
    

    【讨论】:

      【解决方案2】:

      使用rowSums。要从数据框 (df) 中删除精确包含 n NA 值的行:

      df <- df[rowSums(is.na(df)) != n, ]
      

      或删除包含 n 或更多 NA 值的行:

      df <- df[rowSums(is.na(df)) < n, ]
      

      在这两种情况下,当然用所需的号码替换 n

      【讨论】:

      • +1 用于n。不过,您可能想解释一下 n 的含义。
      • 这会在df 中生成一个名为row.names 的新列,这是为什么呢?这是我不明白的 R 现象之一。有时函数会输出我没想到的额外内容。
      【解决方案3】:

      如果d 是您的数据框,试试这个:

      d <- d[rowSums(is.na(d)) < 2,]
      

      【讨论】:

        【解决方案4】:

        如果 dat 是您的 data.frame 的名称,则以下内容将返回您要查找的内容:

        keep <- rowSums(is.na(dat)) < 2
        dat <- dat[keep, ] 
        

        这是做什么的:

        is.na(dat) 
        # returns a matrix of T/F
        # note that when adding logicals 
        # T == 1, and F == 0
        
        rowSums(.)
        # quickly computes the total per row 
        # since your task is to identify the
        # rows with a certain number of NA's 
        
        rowSums(.) < 2 
        # for each row, determine if the sum 
        # (which is the number of NAs) is less
        # than 2 or not.  Returns T/F accordingly 
        

        我们使用最后一条语句的输出来 确定要保留的行。请注意,没有必要实际存储最后一个逻辑。

        【讨论】:

          猜你喜欢
          • 2019-09-13
          • 1970-01-01
          • 1970-01-01
          • 2017-08-16
          • 2014-08-15
          • 2016-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多