【问题标题】:remove duplicate values with preference for removal from largest group删除重复值,优先从最大组中删除
【发布时间】:2019-04-15 10:54:04
【问题描述】:

我有一个 tibble,我想删除具有重复值的行,但偏好从最大组中删除

示例数据:

(tb <- tibble(group = rep(LETTERS[1:3], times = 3:1),
             value = c(4,2,1,1,2,1)))
# A tibble: 6 x 2
  group value
  <chr> <dbl>
1 A         4
2 A         2
3 A         1
4 B         1
5 B         2
6 C         1

这里,值 1 和 2 是重复的。对于 1 的情况,我希望将其从 2 个较大的组(A 和 B)中删除,并保留 C 的值。同样,值 2 的行应该从组 A 中删除。(当组大小相同时,从哪个组中删除该行并不重要。)

想要的结果

# A tibble: 3 x 2
  group value
  <chr> <dbl>
1 A         4
2 B         2
3 C         1

使用tb %&gt;% filter(!duplicated(value)) 可以删除重复,但不考虑组大小:

实际结果

# A tibble: 3 x 2
  group value
  <chr> <dbl>
1 A         4
2 A         2
3 A         1

在删除重复项时是否有一个(简单的)tidyverse 可以考虑组大小?

【问题讨论】:

  • 如果A有4、2、1、1、1、1、1,B有5、2、2,那么结果应该是什么?即,最初组 A 较大,但如果我们先删除 1,那么在考虑删除 2 时,B 会更大。在这种情况下,要删除的数字顺序也开始很重要,所以也许只有初始大小很重要?
  • @JuliusVainora 好点。我的数据在组内不包含任何重复项,并且重复项的总量

标签: r dplyr duplicates


【解决方案1】:

怎么样:

tb %>% group_by(group) %>%
  mutate(size = n()) %>% group_by(value) %>%
  filter(size == min(size))

group value  size
  <chr> <dbl> <int>
1 A         4     3
2 B         2     2
3 C         1     1

【讨论】:

  • 顺便说一句,您可以考虑在最后一行中使用slice(which.min(size)) 而不是filter
  • 按照你的建议去做有优势吗?
  • 至少你不必重复'size'变量名,但我不知道有什么性能提升。在这种情况下,变量只包含 4 个字符,但在其他情况下,我认为我提出的方法最终会更简洁。
  • 确实如此。感谢您的意见!
  • 工作得很好!结合起来,我使用了这个解决方案:tb %&gt;% add_count(group) %&gt;% group_by(value) %&gt;% slice(which.min(n))
【解决方案2】:

这个呢:

 tb <- tibble(group = rep(LETTERS[1:3], times = 3:1),
 value = c(4,2,6,1,2,1))

group value
  <chr> <dbl>
1 A         4
2 A         2
3 A         6
4 B         1
5 B         2
6 C         1

tb %>% group_by(value) %>% filter(group == max(group))

group value
  <chr> <dbl>
1 A         4
2 A         6
3 B         2
4 C         1

tb <- tibble(group = rep(LETTERS[1:3], times = 3:1),
              value = c(4,2,1,1,2,1))

 group value
  <chr> <dbl>
1 A         4
2 A         2
3 A         1
4 B         1
5 B         2
6 C         1

tb %>% group_by(value) %>% filter(group == max(group))

group value
  <chr> <dbl>
1 A         4
2 B         2
3 C         1

【讨论】:

  • group_by(value) 是个好主意,但是当我有不同的组名时,这种解决方案在我的情况下不起作用,因为这种硬编码从哪些组中进行删除(而不是实际检查它们的尺寸)。例如,它不适用于tb &lt;- tibble(group = rep(LETTERS[3:1], times = 3:1), value = c(4,2,1,1,2,1))
  • 也许吧? tb %>% group_by(group) %>% add_tally() %>% group_by(value) %>% filter(n==min(n))
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 2014-10-10
  • 2012-09-26
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
相关资源
最近更新 更多