按组筛选重复项(R)

时间:2018-12-12 06:17:24

标签: r dplyr duplicates tidyverse data-manipulation

示例数据如下所示,

1)我需要删除在ID GroupID中拥有多个Month的人员(0)。因此,例如,FGH不应包含在我的分析中。

2)我想计算从第0个月到第4个月(第1、2、3和4个月)连续拥有相同ID的人(唯一GroupID)的百分比。 (示例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解决方案来解决这种看似简单的操作。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

这是一个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)