【问题标题】:How to find duplicates based on values in 2 columns but also the groupings by another column in R?如何根据 2 列中的值以及 R 中另一列的分组来查找重复项?
【发布时间】:2019-07-02 16:32:51
【问题描述】:

我有一个包含 3 列的数据集:ID、值 a 和值 b。我想根据 ID 列中的值对数据集进行分组,然后识别在不同分组之间的值 a 和 b 列中具有相同数据的重复项。

我知道我可以使用 dplyr 包和数据 %>% group_by (ID) 根据 ID 列对我的数据集进行分组。我也知道我可以使用 data[duplicated(data[,2:3]),] 返回第 2 行(值 a)和第 3 行(值 b)中具有重复数据的所有行。

但是,我想要一个只能查找不同 ID 组之间的重复项而不是整个数据集中的重复项的函数。我试过组合 group_by 和 duplicated,但它没有返回正确的结果。哪个函数可以做到这一点?

【问题讨论】:

  • 这样的事情将适用于您的情况dt %>% distinct(ID, a, b),因为您有 3 列,所有列都将用于发现您的重复项。
  • 你可以提供一个可重现的例子,告诉你想要什么结果

标签: r


【解决方案1】:

你是否想返回有点不清楚:

  1. 只有不同的行
  2. 重复行的单个示例
  3. 所有重复的行

所以这里有一些选项:

library(dplyr)
library(readr)

"ID,a,b
 1, 1, 1
 1, 1, 1
 1, 1, 2
 2, 1, 1
 2, 1, 2" %>% 
  read_csv() -> exp_dat

# return only distinct rows
exp_dat %>% 
  distinct(ID, a, b)

# # A tibble: 4 x 3
#      ID     a     b
#   <dbl> <dbl> <dbl>
# 1     1     1     1
# 2     1     1     2
# 3     2     1     1
# 4     2     1     2

# return single examples of duplicated rows
exp_dat %>% 
  group_by(ID, a, b) %>% 
  count() %>% 
  filter(n > 1) %>% 
  ungroup() %>% 
  select(-n)

# # A tibble: 1 x 3
#      ID     a     b
#   <dbl> <dbl> <dbl>
# 1     1     1     1

# return all duplicated rows
exp_dat %>% 
  group_by(ID, a, b) %>% 
  add_count() %>% 
  filter(n > 1) %>% 
  ungroup() %>% 
  select(-n)

# # A tibble: 2 x 3
#      ID     a     b
#   <dbl> <dbl> <dbl>
# 1     1     1     1
# 2     1     1     1

【讨论】:

  • 如果我想返回每个重复序列的重复次数怎么办?
  • 删除 select(-n) 行以保留计数。
  • 你能解释一下 ungroup() 部分的作用吗?
  • group_by() 将不可见的分组添加到数据中,以便函数单独处理每个组。 ungroup() 删除了这个不可见的分组。可能没有必要 - 特别是如果您不进一步处理数据。
  • 所以 ungroup() 实际上不会影响输出?
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多