【问题标题】:Filter to all rows where there are duplicate values in two columns (dplyr) [duplicate]过滤到两列中有重复值的所有行(dplyr)[重复]
【发布时间】:2019-03-01 14:57:20
【问题描述】:

我有一个如下所示的数据框:

id        dob lname
1 1900-01-01     a
2 1900-01-01     b
3 1900-01-01     b
4 1901-01-01     c
5 1901-01-01     d
6 1902-01-01     e
7 1902-01-01     e
8 1902-01-01     f
9 1903-01-01     g
10 1903-01-01     h

我想过滤以显示 dob 重复且 lname 重复的所有行,因此所需的输出如下所示:

id        dob lname
2 1900-01-01     b
3 1900-01-01     b
6 1902-01-01     e
7 1902-01-01     e

我尝试按 dob 和 lname 进行分组,但我被困在下一步,这将返回这些列具有重复值的所有行。

示例代码如下:

id <- c(1:10)
dob <- date(c("1900-01-01", "1900-01-01", "1900-01-01", "1901-01-01", "1901-01-01", "1902-01-01", "1902-01-01", "1902-01-01", "1903-01-01", "1903-01-01"))
lname <- c("a", "b", "b", "c", "d", "e", "e", "f", "g", "h")
df <- data.frame("id" = id, "dob" = dob, "lname" = lname)

【问题讨论】:

  • 从技术上讲,您的问题与此相反,但您可以使用 hadley 的答案并过滤 row_number(z) &gt; 1
  • 相关:Subset data frame based on number of rows per group。将每组的行数调整为您想要的条件。
  • @divibisan 你知道如何使用distinct(),因为哈德利指出它是为此目的而创建的吗? distinct() 的反义词怎么称呼?
  • @divibisan using row_number() &gt; 1 并不能完全给我我想要的输出,因为它仍然消除了每组重复项中的一个行。使用我上面的例子,它只给了我 ID 为 37 的行。我不认为这是一个重复的问题。
  • 你想要n() 而不是row_number() - df %&gt;% group_by(dob,lname) %&gt;% filter(n() &gt; 1) - 这使得这与@Henrik 的建议重复。

标签: r dplyr


【解决方案1】:

这是使用基础 R 的单行解决方案 -

id <- c(1:10)
dob <- as.Date(c("1900-01-01", "1900-01-01", "1900-01-01", "1901-01-01", "1901-01-01", "1902-01-01", "1902-01-01", "1902-01-01", "1903-01-01", "1903-01-01"))
lname <- c("a", "b", "b", "c", "d", "e", "e", "f", "g", "h")
df <- data.frame("id" = id, "dob" = dob, "lname" = lname)

result <- df[duplicated(df[,2:3]) | duplicated(df[,2:3], fromLast = T), ]
result

用于管道 -

df %>% .[duplicated(.[,2:3]) | duplicated(.[,2:3], fromLast = T), ]

另一个dplyr 方法-

df %>% filter(., ave(seq_len(nrow(.)), dob, lname, FUN = length) > 1)

【讨论】:

    【解决方案2】:

    dplyr 解决方案是否满足您的需求?

    library(dplyr)
    
        df %>%
             semi_join(df %>%
                       group_by(dob, lname) %>%
                       filter(row_number()>1), 
                       by = c("dob", "lname"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 2018-06-13
      • 2020-12-01
      • 1970-01-01
      • 2019-07-14
      • 2018-07-30
      • 1970-01-01
      • 2015-07-06
      相关资源
      最近更新 更多