我有一个数据集,大致如下所示:
Subject Year X Y A 1990 1 0 A 1991 1 0 A 1992 2 0 A 1993 3 1 A 1994 4 0 A 1995 4 0 B 1990 0 0 B 1991 1 0 B 1992 1 0 B 1993 2 1 C 1991 1 0 C 1992 2 0 C 1993 3 0 C 1994 3 0 D 1991 1 0 D 1992 2 0 D 1993 3 0 D 1994 4 0 D 1995 5 0 D 1996 5 1 D 1997 6 0
我如何创建两个额外的列,其中
- 如果X增加并且该主体的最大值至少为4,则A1为1。否则为0。我尝试过
data$A1 <- as.numeric(data$X >4)
,但这不是我想要的结果。 - A2的解释稍微复杂一些,我不知道如何在R中实现它。但它的基本思想与A1相同,意味着它仍然应该捕捉所有大于3的X。只是,当接下来的5年Y=0时,它应该是1。我给出了一个A2变量应该是什么样的例子。这在R中可以实现吗?还是我需要手动操作?
结果:
Subject Year X A1 Y A2 A 1990 1 1 0 0 A 1991 1 0 0 0 A 1992 2 1 0 0 A 1993 3 1 1 0 A 1994 4 1 0 0 A 1995 4 0 0 0 B 1990 0 0 0 0 B 1991 1 0 0 0 B 1992 1 0 0 0 B 1993 2 0 1 0 C 1991 1 0 0 0 C 1992 2 0 0 0 C 1993 3 0 0 0 C 1994 3 0 0 0 D 1991 1 1 0 1 D 1992 2 1 0 1 D 1993 3 1 0 1 D 1994 4 1 0 1 D 1995 5 1 0 1 D 1996 5 0 1 0 D 1997 6 1 0 0
没有A1和A2变量的原始数据:
> dput(data)structure(list(Subject = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), Year = c(1990L, 1991L, 1992L, 1993L, 1994L, 1995L, 1990L, 1991L, 1992L, 1993L, 1991L, 1992L, 1993L, 1994L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L), X = c(1L, 1L, 2L, 3L, 4L, 4L, 0L, 1L, 1L, 2L, 1L, 2L, 3L, 3L, 1L, 2L, 3L, 4L, 5L, 5L, 6L), Y = c(0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L)), .Names = c("Subject", "Year", "X", "Y"), class = "data.frame", row.names = c(NA, -21L))
回答:
我们可以使用data.table
来实现这一点
library(data.table)setDT(data)[, A1 := if(any(X >=4)) c(1, diff(X)) else 0, by = Subject]data[, A2 := if(any(X >=3)) inverse.rle(within.list(rle(Y==0), values[values][lengths[values] < 5] <- 0)) else 0, by = Subject]data[, c("Subject", "Year", "X", "A1", "Y", "A2"), with = FALSE]# Subject Year X A1 Y A2# 1: A 1990 1 1 0 0# 2: A 1991 1 0 0 0# 3: A 1992 2 1 0 0# 4: A 1993 3 1 1 0# 5: A 1994 4 1 0 0# 6: A 1995 4 0 0 0# 7: B 1990 0 0 0 0# 8: B 1991 1 0 0 0# 9: B 1992 1 0 0 0#10: B 1993 2 0 1 0#11: C 1991 1 0 0 0#12: C 1992 2 0 0 0#13: C 1993 3 0 0 0#14: C 1994 3 0 0 0#15: D 1991 1 1 0 1#16: D 1992 2 1 0 1#17: D 1993 3 1 0 1#18: D 1994 4 1 0 1#19: D 1995 5 1 0 1#20: D 1996 5 0 1 0#21: D 1997 6 1 0 0