【问题标题】:Only keep levels that are incomplete, based on two columns仅保留基于两列的不完整级别
【发布时间】:2018-11-15 20:13:47
【问题描述】:

我真的可以在以下方面使用一些帮助:

我的一些示例数据:

Group<-c("A","A","B","B","C","C","D", "D")
Value1<-c("7","1",8,7,"NA",9,10,12)
Value2<-c("NA","NA","NA",7,3,9,7,4)
df<-data.frame(Group, Value1, Value2)

  Group Value1 Value2
     A      7     NA
     A      1     NA
     B      8     NA
     B      7      7
     C     NA      3
     C      9      9
     D     10      7
     D     12      4

我想删除所有已完全填写 Value1 和 Value2 的组(如 D 组)或组内没有 Value2 的数据(如 A 组)。所以我最终得到了为 Value1 和 Value2 填写但不完整的组,例如:

  Group Value1 Value2
     B      8     NA
     B      7      7
     C     NA      3
     C      9      9

我知道如何删除 NA,我已经尝试了一些方法

setDT()[,  := if(any(Value2==)) "" else "" , by = .()]

但我现在真的不知道在这种情况下如何使用它..

有人知道我该怎么做吗?

【问题讨论】:

    标签: r na delete-row


    【解决方案1】:

    使用来自@arg0naut 的数据(将NA 保留为NA 而不是“NA”)使用两个ave 的基本R 解决方案将是

    df[!with(df, ave(complete.cases(df), Group, FUN = all) | 
                 ave(is.na(Value2), Group, FUN = all)), ]
    
    #  Group Value1 Value2
    #3     B      8     NA
    #4     B      7      7
    #5     C     NA      3
    #6     C      9      9
    

    我们分别保留两个条件,找到我们不想选择的行,然后取反。

    【讨论】:

      【解决方案2】:

      类似:

      setDT(df)[, .SD[!all(is.na(Value2)) & (anyNA(Value1) | anyNA(Value2))], Group]
      

      输出:

         Group Value1 Value2
      1:     B      8     NA
      2:     B      7      7
      3:     C   <NA>      3
      4:     C      9      9
      

      请注意,为了使其工作,您的值确实应该是 NA 而不仅仅是 "NA" 作为字符串,即它适用于修改后的数据框示例:

      Group<-c("A","A","B","B","C","C","D", "D")
      Value1<-c("7","1",8,7,NA,9,10,12)
      Value2<-c(NA,NA,NA,7,3,9,7,4)
      df<-data.frame(Group, Value1, Value2)
      

      【讨论】:

      • 也可以是tidyverse: library(tidyverse); df %&gt;% mutate_at(-1,~ifelse(. == "NA", NA, .)) %&gt;% group_by(Group) %&gt;% filter(!all(is.na(Value2)) &amp; (anyNA(Value1) | anyNA(Value2)))
      • 另外,前两个 'Value1' 数字是字符串而不是整数,这使得列的因素而不是整数。
      • @arg0naut & Jimbou 谢谢!两者都完美! wl1234 & arg0naut 感谢您的通知,我不确定如何使用 NA 数据创建整数,所以我这样做了。在真实数据中,值列都是整数
      猜你喜欢
      • 2017-12-29
      • 2012-03-10
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多