【问题标题】:Filtering Duplicates By Group (R)按组过滤重复项 (R)
【发布时间】:2018-12-12 06:17:24
【问题描述】:

示例数据如下图,

1) 我需要删除在Month0 中记录了多个GroupID 的人(IDs)。例如,FGH 不应包含在我的分析中。

2) 我想计算从第 0 个月到第 4 个月(第 1 个月、第 2 个月、第 3 个月和第 4 个月)连续拥有相同 GroupID 的人(唯一 IDs)的百分比。 (例如 ID ABC 符合此标准,即使它们在第 1 个月记录了两个组 ID)。

(ID实际上是9位数字)。有些 ID 每个月都有几个组 ID(例如 YUI)。

ID   Month   GroupID
ABC   0      390988
ABC   1      390988
ABC   1      934667
ABC   2      390988
ABC   3      390988
ABC   4      390988
FGH   0      678743
FGH   0      789555
FGH   1      678666
FGH   2      678666
FGH   2      982342
YUI   0      989000
YUI   1      567099
YUI   2      873467
YUI   3      567099
YUI   3      348938
YUI   4      567099

我对 R 有点陌生,我正在寻找 dplyr/ tidyverse 解决这个看似简单的操作的方法。任何帮助表示赞赏!

【问题讨论】:

  • 您可以发布示例数据吗?请使用dput(df1) 的输出编辑问题。或者,如果 dput(head(df1, 20)) 的输出太大。
  • 我已经扩展了数据和问题,谢谢!

标签: r dplyr duplicates tidyverse data-manipulation


【解决方案1】:

这是一个dplyr 解决方案。分两步,首先是问题 1,然后是输入数据问题 1 的输出。

library(dplyr)

df2 <- df1 %>%
  group_by(ID) %>%
  mutate(zeros = sum(Month == 0)) %>%
  filter(zeros < 2) %>%
  select(-zeros)

df2
## A tibble: 5 x 3
## Groups:   ID [2]
#  ID    Month GroupID
#  <fct> <int>   <int>
#1 ABC       0     390
#2 ABC       1     390
#3 ABC       2     390
#4 YUI       0     989
#5 YUI       1     567

现在将此输出用作下一个管道的输入。

df3 <- df2 %>%
  group_by(ID) %>%
  mutate(M = c(TRUE, diff(Month) == 1),
         G = GroupID[M],
         G = length(unique(G))) %>%
  filter(M & G == 1) %>%
  select(-M, -G)

df3
## A tibble: 3 x 3
## Groups:   ID [1]
#  ID    Month GroupID
#  <fct> <int>   <int>
#1 ABC       0     390
#2 ABC       1     390
#3 ABC       2     390

数据。

df1 <- read.table(text = "
ID   Month   GroupID
ABC   0      390
ABC   1      390
ABC   2      390 
FGH   0      678
FGH   0      789
FGH   1      678
FGH   2      678
YUI   0      989
YUI   1      567                  
", header = TRUE)

【讨论】:

  • 感谢您的帮助!但是,第二种解决方案不起作用,因为我提供的 groupID 只是一个示例(它有 6 位),而 ID 有 9 位。运行时出现以下错误,df3 % group_by(ID) %>% mutate(M = c(TRUE, diff(Month) == 1), G = GroupID[M], G = length (unique(G)) . "列 G 的长度必须为 6(组大小)或 1,而不是 4"
  • @NewBee 查看我对该问题的评论。
猜你喜欢
  • 2015-05-23
  • 2016-10-03
  • 1970-01-01
  • 2012-09-23
  • 2021-09-27
  • 2018-06-11
  • 2017-10-03
  • 2018-01-18
  • 1970-01-01
相关资源
最近更新 更多