【问题标题】:Filter for rows with duplicate values in dplyr在 dplyr 中过滤具有重复值的行
【发布时间】:2021-03-16 17:30:34
【问题描述】:

小标题:

df <- tibble(x = c(1, 3, 2, 5, 3, 7, 1, 9),
              y = c(rep("condition_one", 5), rep("condition_two", 3)))

目标:

我想在xcondition_one 中返回y 中的“非唯一”值行。在此示例中,它将是第 2 行和第 5 行,因为值 3 在x 中不是唯一的,而ycondition_one

我首先尝试的是使用 base R 中的 duplicated() 函数:

df %>% 
  filter(duplicated(.$x) & y == "condition_one")

输出:

# A tibble: 1 x 2
      x y            
  <dbl> <chr>        
1     3 condition_one

虽然它只返回重复的行而不是“原始”行。 在这种情况下,我还可以包含在 dplyr 管道链中的解决方案是什么?

编辑:

我看到一些答案仍然不能解决我的问题,我认为这是因为我的问题表述得很糟糕: 在我的过滤输出中,我只想要 x 中的值不唯一的行。但我希望 R 返回所有非唯一行,而不仅仅是第一次出现重复值的行(duplicate() 正在发生这种情况)。 最重要的是,我想要y == "condition_one"

【问题讨论】:

  • 你可以做df %&gt;% group_by(x, y) %&gt;% filter(n() != 1)

标签: r dplyr


【解决方案1】:

如果您想在 df$y 满足“condition_one”或相反的情况下查找宇宙中的重复项,我不确定我是否知道。两种情况我都会写。

在基础 R 中:

案例1:找到所有重复项,然后找出符合条件的。

all_duplicates <- df[duplicated(df$x) | duplicated(df$x, fromLast = TRUE), ]
your_condition <- all_duplicates[all_duplicates$y == "condition_one", ]

案例2:找到满足条件的,然后在那里找到重复项。

df_cond <- df[df$y == "condition_one", ]

all_duplicates <- df_cond[duplicated(df_cond$x) | duplicated(df_cond$x, fromLast = TRUE), ]

【讨论】:

  • 这仍然只返回重复值,而不是“原始”值。
  • 我的错。它现在应该可以工作了。我忘了添加 df$x 而不仅仅是 df
  • 它仍然只为我返回重复值
  • 哦,好吧,我想我已经弄明白了。
【解决方案2】:

解决办法如下:

df %>% 
  group_by(x) %>% 
  filter(y == "condition_one" & n() == 1) %>% 
  ungroup()

#Results:
# A tibble: 2 x 2
      x y            
  <dbl> <chr>        
1     2 condition_one
2     5 condition_one

【讨论】:

  • 这将返回 x 中的值 2 和 5。不是x 中的第二行和第五行,其中 3 是重复值。
【解决方案3】:

使用dplyr

library(dplyr)
df %>%
    filter(duplicated(cur_data()) & y == 'condition_one')

【讨论】:

  • 这只会返回x中的第一个重复值
猜你喜欢
  • 2019-03-01
  • 2021-10-04
  • 2019-07-14
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
相关资源
最近更新 更多