我有一个数据框,其中包含患者检查日期(c)和注射(i)
Pat Date ID Visit
1,d 2016-01-25 122 c
1,d 2016-04-26 213 i
1,d 2016-05-23 274 c
1,d 2016-08-31 201 c
1,d 2016-10-25 223 i
3,s 2015-05-26 123 c
3,s 2015-07-01 450 i
3,s 2015-07-21 234 c
3,s 2016-01-13 345 i
3,s 2016-02-22 278 c
我只对以下内容感兴趣: 预检, 注射和 检查后(c-i-c)。
但也可以使用一次注射的检查后作为后续注射的预检查。这是一个计划应该是什么样子,在一次伤害之前和之后检查身份?
Pat Date ID Visit Before-ID After-ID
1,d 2016-01-25 122 c
1,d 2016-04-26 213 i 122 274
1,d 2016-05-23 274 c
1,d 2016-08-31 201 c
1,d 2016-10-25 223 i 201 0
3,s 2015-05-26 123 c
3,s 2015-07-01 450 i 123 234
3,s 2015-07-21 234 c
3,s 2016-01-13 345 i 234 278
3,s 2016-02-22 278 c
感谢您提前提供的任何想法!
答案 0 :(得分:2)
这是一种dplyr
方法。对于每个患者,只要有注射行,我们就会得到上一个和下一个访问ID(如果存在),如果它们不存在,我们使用0
。如果存在非注入行,则我们使用NA
值。
df = read.table(text = "
Pat Date ID Visit
1,d 2016-01-25 122 c
1,d 2016-04-26 213 i
1,d 2016-05-23 274 c
1,d 2016-08-31 201 c
1,d 2016-10-25 223 i
3,s 2015-05-26 123 c
3,s 2015-07-01 450 i
3,s 2015-07-21 234 c
3,s 2016-01-13 345 i
3,s 2016-02-22 278 c
", header=T, stringsAsFactors=F)
library(dplyr)
df %>%
group_by(Pat) %>%
mutate(Before_ID = ifelse(Visit == "i", lag(ID, default = 0), NA),
After_ID = ifelse(Visit == "i", lead(ID, default = 0), NA)) %>%
ungroup()
# # A tibble: 10 x 6
# Pat Date ID Visit Before_ID After_ID
# <chr> <chr> <int> <chr> <int> <int>
# 1 1,d 2016-01-25 122 c NA NA
# 2 1,d 2016-04-26 213 i 122 274
# 3 1,d 2016-05-23 274 c NA NA
# 4 1,d 2016-08-31 201 c NA NA
# 5 1,d 2016-10-25 223 i 201 0
# 6 3,s 2015-05-26 123 c NA NA
# 7 3,s 2015-07-01 450 i 123 234
# 8 3,s 2015-07-21 234 c NA NA
# 9 3,s 2016-01-13 345 i 234 278
#10 3,s 2016-02-22 278 c NA NA