按组使用ifelse功能

时间:2017-05-11 12:14:40

标签: r

我有以下数据框:

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之后(在之前的行中)之后的所有行,0by(),否则为{{1}}。有没有人有如何解决它的建议?我用{{1}}尝试过,但我不知道如何制定条件。

提前致谢

4 个答案:

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

以下是包含avecummax

的基础R解决方案
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或更高版本后开始行,则可以包含chead这样的

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