对行序列进行分组(在事件之前和之后)

时间:2018-03-30 23:09:22

标签: r

我有一个数据框,其中包含患者检查日期(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

感谢您提前提供的任何想法!

1 个答案:

答案 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