示例数据如下所示,
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
解决方案来解决这种看似简单的操作。任何帮助表示赞赏!
答案 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)