我需要帮助编码一个二进制列,指示一个测量值高于阈值,并在第二个测量值的一年间隔内找到。 Dataframe 有4列(ID,结果类型,日期和结果值),可能如下所示:
IDrow type Date value
1 ID1 NP1 2018-06-11 4.5
2 ID1 NP2 2018-08-21 55
3 ID2 NP1 2016-04-23 4.7
4 ID3 NP1 2015-11-24 9.5
5 ID3 NP2 2015-11-24 7390
6 ID3 NP2 2016-11-24 308
7 ID4 NP1 2015-01-01 6.0
8 ID4 NP2 2018-01-01 100
9 ID5 NP1 2013-04-04 4.0
10 ID5 NP2 2013-04-04 13
如表所示,有两种类型的结果。一些ID没有两种类型,这很好。我需要帮助来编写一个新列,指示NP 2发生在NP 1测量的+-一年内。如果这是真的,并且NP 2的值大于〉25,那么新列应该是1。如果NP 2结果对ID不可用,如果在NP 1日期间隔中未找到NP 2的日期,则该列应声明为0(对于ID 4),并且如果在该间隔中找到了日期,但NP 2的值〈25,则该列也应声明为0(对于ID 5)。
我想要的输出如下所示:
IDrow type Date value positive
1 ID1 NP1 2018-06-11 4.5 1
2 ID1 NP2 2018-08-21 55 1
3 ID2 NP1 2016-04-23 4.7 0
4 ID3 NP1 2015-11-24 9.5 1
5 ID3 NP2 2015-11-24 7390 1
6 ID3 NP2 2016-11-24 308 1
7 ID4 NP1 2015-01-01 6.0 0
8 ID4 NP2 2018-01-01 100 0
9 ID5 NP1 2013-04-04 4.0 0
10 ID5 NP2 2013-04-04 13 0
我已经尝试过dplyr与mutate和case_when,但我的技能与dplyr不足时,与日期的工作。
IDrow <- c("ID1", "ID1", "ID2", "ID3", "ID3", "ID3", "ID4", "ID4", "ID5", "ID5")
type <- c("NP1", "NP2", "NP1", "NP1", "NP2", "NP2", "NP1", "NP2", "NP1", "NP2")
Date <- c("2018-06-11","2018-08-21",
"2016-04-23",
"2015-11-24", "2015-11-24", "2016-11-24",
"2015-01-01", "2018-01-01",
"2013-04-04", "2013-04-04")
value <- c("4.5", "55",
"4.7",
"9.5", "7390", "308",
"6.0", "100",
"4.0", "13")
df <- as.data.frame(cbind(IDrow, type, Date, value))
df$Date <- ymd(df$Date)
df <- df %>% group_by(IDrow, Date) %>%
mutate(positive = case_when
("NP2" %in% type & Date %within% Date+-duration(365, units="days") & "NP1" %in% type ~ 1))
提前感谢-任何帮助都是感激之情。
1条答案
按热度按时间htrmnn0y1#