如何删除基于两列的所有重复行?

时间:2019-07-12 10:45:52

标签: r dataframe duplicates

我有一个数据框,我想删除重复的行,但是仅当来自另一列的值对于所有行都相同时,我才想删除它们。 (更清楚地说,我要删除所有行都具有相同“ Number”值的重复行)

有一个我的数据框示例:

df <- data.frame("Name" = c("a", "a", "b", "b", "b", "c", "c", "c"),
                 "Number" = c(1, 1, 1, 2, 3, 4, 5, 5), stringsAsFactors = FALSE)

我期望的结果是:

result <- data.frame("Name" = c("b", "b", "b", "c", "c", "c"),
                     "Number" = c(1, 2, 3, 4, 5, 5), stringsAsFactors = FALSE)

3 个答案:

答案 0 :(得分:3)

我们可以group_by Name删除具有多于1行且只有一个不同值的组。

library(dplyr)

df %>%
  group_by(Name) %>%
  filter(!(n_distinct(Number) == 1 & n() > 1))

#  Name  Number
#  <chr>  <dbl>
#1 b          2
#2 b          2
#3 b          3

并使用基数R ave,可以将相同的逻辑写为

df[with(df, !as.logical(ave(Number, Name, FUN = function(x) 
            length(unique(x)) == 1 & length(x) > 1))), ]

答案 1 :(得分:2)

这是data.table

的解决方案
library("data.table")
df <- data.table("Name" = c("a", "a", "b", "b", "b"),
                 "Number" = c(1, 1, 2, 2, 3))

df[, if (uniqueN(Number)!=1 || .N==1) .SD, Name]

这是一个以R为基础的解决方案:

df <- data.frame("Name" = c("a", "a", "b", "b", "b"),
                 "Number" = c(1, 1, 2, 2, 3), stringsAsFactors = FALSE)

df[as.logical(ave(df$Number, df$Name, FUN=function(x) length(unique(x))!=1 || length(x)==1)),]

答案 2 :(得分:1)

我们可以使用data.table方法

library(data.table)
setDT(df)[, .SD[uniqueN(Number) > 1] , Name]
#   Name Number
#1:    b      1
#2:    b      2
#3:    b      3
#4:    c      4
#5:    c      5
#6:    c      5