我有以下数据框:
example.frame = data.frame("ID" = c(1,1,1,1,2,2,2,3,3,3,3)
, "AL" = c(1,1,2,4,1,3,4,1,5,1,2)
, "marker" = c(0,0,0,0,0,0,0,0,0,1,1))
我想要实现的是,对于每个ID
组,marker
变量在以下条件下填充。对于1
AL
或更高5
之后(在之前的行中)之后的所有行,0
为by()
,否则为{{1}}。有没有人有如何解决它的建议?我用{{1}}尝试过,但我不知道如何制定条件。
提前致谢
答案 0 :(得分:4)
通过基数R的想法,假设每组中只有1个值> = 5,
with(example.frame, ave(AL, ID, FUN = function(i)
replace(cumsum(i >= 5), i >= 5, 0)))
#[1] 0 0 0 0 0 0 0 0 0 1 1
答案 1 :(得分:3)
以下是包含ave
和cummax
example.frame$marker <- ave(example.frame$AL, example.frame$ID,
FUN=function(x) cummax(x >= 5))
example.frame
ID AL marker
1 1 1 0
2 1 1 0
3 1 2 0
4 1 4 0
5 2 1 0
6 2 3 0
7 2 4 0
8 3 1 0
9 3 5 1
10 3 1 1
11 3 2 1
或者,如果目标是在遇到5或更高版本后开始行,则可以包含c
和head
这样的
ave(example.frame$AL, example.frame$ID, FUN=function(x) c(0, head(cummax(x >= 5), -1)))
[1] 0 0 0 0 0 0 0 0 0 1 1
答案 2 :(得分:2)
我们可以使用data.table
library(data.table)
setDT(example.frame)[, marker := +((cumsum(shift(AL >=5, fill=FALSE)))>0), ID]
example.frame
# ID AL marker
# 1: 1 1 0
# 2: 1 1 0
# 3: 1 2 0
# 4: 1 4 0
# 5: 2 1 0
# 6: 2 3 0
# 7: 2 4 0
# 8: 3 1 0
# 9: 3 5 0
#10: 3 1 1
#11: 3 2 1
答案 3 :(得分:1)
dplyr
library(dplyr)
example.frame = data.frame("ID" = c(1,1,1,1,2,2,2,3,3,3,3)
, "AL" = c(1,1,2,4,1,3,4,1,5,1,2)) %>%
group_by(ID) %>%
mutate(marker = as.numeric(cummax(lag(AL, default = 0)) >= 5))
example.frame