R:发现患者每月至少进行4次血糖测试,并持续至少2个月 df
这里有一个使用R:发现患者每月至少进行4次血糖测试,并持续至少2个月 df,r,R,这里有一个使用dplyr的解决方案。我按患者和试验月分组,计算患者每月进行的试验次数。然后,我计算每个患者测试之间的月差,考虑年度问题。然后,我筛选2个月内至少进行过两次连续检查(因此month_diff==1)且每月至少进行4次检查的患者。然后我只保留第一个测试点,并删除现在未使用的变量month\u dif和n df <- data.frame(PATIENT_ID=c(2), test.year=c(2001), test.
dplyr
的解决方案。我按患者和试验月分组,计算患者每月进行的试验次数。然后,我计算每个患者测试之间的月差,考虑年度问题。然后,我筛选2个月内至少进行过两次连续检查(因此month_diff
==1)且每月至少进行4次检查的患者。然后我只保留第一个测试点,并删除现在未使用的变量month\u dif
和n
df <- data.frame(PATIENT_ID=c(2),
test.year=c(2001),
test.month=c(1),
value=c(2.7))
库(dplyr)
df%>%
分组依据(患者ID,检查月份)%>%
变异(n=n())%>%
分组依据(患者ID)%>%
当(test.year==lag(test.year)~test.month-lag(test.month)发生变化时(month_dif=case_),
test.year-滞后(test.year)==1和test.month==1和滞后(test.month)==12~1,
真~NA_real(真)]>%
过滤器(任何(月份_dif==1)&n>=4)%>%
切片头(1)%>%
选择(-month\u dif,-n)
#一个tibble:1 x 4
#分组:患者编号[1]
患者ID测试。年测试。月值
1 2 2001 1 2.7
此更新的解决方案还解决了@Gal提到的年份问题
不在同一年发生两个连续测量点的数据
library(dplyr)
df %>%
group_by(PATIENT_ID, test.month) %>%
mutate(n = n()) %>%
group_by(PATIENT_ID) %>%
mutate(month_dif = case_when(test.year == lag(test.year) ~ test.month - lag(test.month),
test.year - lag(test.year) == 1 & test.month == 1 & lag(test.month) == 12 ~ 1,
TRUE ~ NA_real_)) %>%
filter(any(month_dif == 1) & n >= 4) %>%
slice_head(1) %>%
select(-month_dif, - n)
# A tibble: 1 x 4
# Groups: PATIENT_ID [1]
PATIENT_ID test.year test.month value
<dbl> <dbl> <dbl> <dbl>
1 2 2001 1 2.7
df这里有一个使用dplyr
的解决方案。我按患者和试验月分组,计算患者每月进行的试验次数。然后,我计算每个患者测试之间的月差,考虑年度问题。然后,我筛选2个月内至少进行过两次连续检查(因此month_diff
==1)且每月至少进行4次检查的患者。然后我只保留第一个测试点,并删除现在未使用的变量month\u dif
和n
df <- data.frame(PATIENT_ID=c(2),
test.year=c(2001),
test.month=c(1),
value=c(2.7))
库(dplyr)
df%>%
分组依据(患者ID,检查月份)%>%
变异(n=n())%>%
分组依据(患者ID)%>%
当(test.year==lag(test.year)~test.month-lag(test.month)发生变化时(month_dif=case_),
test.year-滞后(test.year)==1和test.month==1和滞后(test.month)==12~1,
真~NA_real(真)]>%
过滤器(任何(月份_dif==1)&n>=4)%>%
切片头(1)%>%
选择(-month\u dif,-n)
#一个tibble:1 x 4
#分组:患者编号[1]
患者ID测试。年测试。月值
1 2 2001 1 2.7
此更新的解决方案还解决了@Gal提到的年份问题
不在同一年发生两个连续测量点的数据
library(dplyr)
df %>%
group_by(PATIENT_ID, test.month) %>%
mutate(n = n()) %>%
group_by(PATIENT_ID) %>%
mutate(month_dif = case_when(test.year == lag(test.year) ~ test.month - lag(test.month),
test.year - lag(test.year) == 1 & test.month == 1 & lag(test.month) == 12 ~ 1,
TRUE ~ NA_real_)) %>%
filter(any(month_dif == 1) & n >= 4) %>%
slice_head(1) %>%
select(-month_dif, - n)
# A tibble: 1 x 4
# Groups: PATIENT_ID [1]
PATIENT_ID test.year test.month value
<dbl> <dbl> <dbl> <dbl>
1 2 2001 1 2.7
df我在Base-R中提出了这个解决方案。我制作了一个自定义函数来过滤,以避免使用取消列表来堆叠拆分
df <- data.frame(PATIENT_ID=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,2),
test.year=c(2000,2000,2000,2001,2001,2001,2001,2001,2001,2001,2001,2002,2002,2002,2002),
test.month=c(1,1,1,3,3,3,3,12,12,12,12,1,1,1,1),
value=c(3.4,3.2,3.5, 3.9, 1.2, 2.1, 2.9, 2.7, 4.6,5.6,5.9,4.2,4.4,6.1,9.4))
我在Base-R中提出了这个解决方案。我制作了一个自定义函数来过滤,以避免将拆分
与取消列出
df <- data.frame(PATIENT_ID=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,2),
test.year=c(2000,2000,2000,2001,2001,2001,2001,2001,2001,2001,2001,2002,2002,2002,2002),
test.month=c(1,1,1,3,3,3,3,12,12,12,12,1,1,1,1),
value=c(3.4,3.2,3.5, 3.9, 1.2, 2.1, 2.9, 2.7, 4.6,5.6,5.9,4.2,4.4,6.1,9.4))
下面是一个使用数据的选项。表:
> df_new
PATIENT_ID test.year test.month value
8 2 2001 1 2.7
下面是一个使用数据的选项。表:
> df_new
PATIENT_ID test.year test.month value
8 2 2001 1 2.7
你也应该考虑这一年吗?我抄袭了你的代码,但得到了:SLIGHILHAD(1)中的错误。好点,但从这个问题不完全清楚。也可能是测试。月是患者测试的第一个月,不考虑日历月和年份。我现在在回答中注意到了这一点。@Frankyslice\u head
是最新的dplyr
版本的一部分。更新dplyr
然后它应该在测试中起作用。月份是日历月。十二月是12,一月是1。你还应该考虑这一年吗?我抄袭了你的代码,但得到了:SLIGHILHAD(1)中的错误。好点,但从这个问题不完全清楚。也可能是测试。月是患者测试的第一个月,不考虑日历月和年份。我现在在回答中注意到了这一点。@Frankyslice\u head
是最新的dplyr
版本的一部分。更新dplyr
然后它应该在测试中起作用。月份是日历月。12月12日,1月1日。