【问题标题】:r - dedupe the rows with value in dataframer - 对数据框中具有值的行进行重复数据删除
【发布时间】:2017-07-06 11:58:40
【问题描述】:

如何在基于另一列的重复项中仅对具有特定列中值的行进行子集化。

例子:

df

A B  C D 
1 NA 8 7
1 5  8 9
2 6  5 8
2 NA 5 6
3 NA  8 5

所以在上面的数据集中,前 4 行基于 A 列和 C 列是重复的,所以其中我想只选择 B 列中具有值的行。

期望的输出,

A B C D
1 5 8 9
2 6 5 8
3 NA 8 5

谢谢。

【问题讨论】:

  • 如果您可以选择多行怎么办?规则是什么?
  • 用 B 列中的值选择两者。

标签: r duplicates


【解决方案1】:

使用 dplyr:

df <- read.table(text="A B  C D 
1 NA 8 7
1 5  8 9
2 6  5 8
2 NA 5 6
3 NA  8 5", header=T)


df %>% 
  group_by(A,C) %>% 
  filter(n()==1|!is.na(B))

      A     B     C     D
  <int> <int> <int> <int>
1     1     5     8     9
2     2     6     5     8
3     3    NA     8     5

【讨论】:

    【解决方案2】:

    B 上向后或向前重复并且不丢失;或不重复:

    anydup <- duplicated(df[c("A","C")]) | duplicated(df[c("A","C")], fromLast=TRUE)
    df[(anydup & (!is.na(df$B))) | (!anydup),]
    
    #  A  B C D
    #2 1  5 8 9
    #3 2  6 5 8
    #5 3 NA 8 5
    

    或使用ave 根据@HubertL 的dplyr 答案检查每组的长度:

    df[!is.na(df$B) | ave(df$B, df[c("A","C")], FUN=length)==1,]
    #  A  B C D
    #2 1  5 8 9
    #3 2  6 5 8
    #5 3 NA 8 5
    

    【讨论】:

    • ave() 方法在我痒的地方抓到了我。
    • 哈哈,当然!这也是 Seinfeld 的参考 :)
    【解决方案3】:

    这是data.table的一个选项

    library(data.table)
    setDT(df)[df[, .I[.N==1 | complete.cases(B)] , .(A, C)]$V1]
    #    A  B C D
    #1: 1  5 8 9
    #2: 2  6 5 8
    #3: 3 NA 8 5
    

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2019-11-12
      • 2019-06-02
      • 2016-11-02
      • 1970-01-01
      • 2017-01-10
      相关资源
      最近更新 更多