随着时间的推移逐组行操作R.

时间:2017-05-10 12:43:16

标签: r dplyr

问题: 我正在尝试为每个 ID 组中的所有行创建等于1的变量 x2 ,其中 time x1 从1切换到0。 此外,在切换后,运行中每连续0, x2 设置为1.

我试图弄清楚如何使用library(dplyr)执行此操作,但无法弄清楚如何查看组中的先前记录。

输入数据:

ID<-c("1","1","1","1","1","2","2","2","2","3","3","3","4","4","5","5","5")
time<-c("1","2","3","4","5","1","2","3","4","1","2","3","1","2","1","2","3")
x1<-c("0","1","1","1","1","0","0","0","0","1","0","0","1","1","1","0","1")
df<-data.frame(ID,time,x1)

必填项:

ID time x1 x2
1    1  0  0
1    2  1  0
1    3  1  0
1    4  1  0
1    5  1  0
2    1  0  0
2    2  0  0
2    3  0  0
2    4  0  0
3    1  1  0
3    2  0  1
3    3  0  1
4    1  1  0
4    2  1  0
5    1  1  0
5    2  0  1
5    3  1  0

2 个答案:

答案 0 :(得分:1)

最好是拥有&#39; x1&#39;作为numeric

library(data.table)
setDT(df)[,  x2 := (cumsum(x1) < 2)*cumsum(c(FALSE, diff(x1) < 0)), ID]
df
#    ID time x1 x2
# 1:  1    1  0  0
# 2:  1    2  1  0
# 3:  1    3  1  0
# 4:  1    4  1  0
# 5:  1    5  1  0
# 6:  2    1  0  0
# 7:  2    2  0  0
# 8:  2    3  0  0
# 9:  2    4  0  0
#10:  3    1  1  0
#11:  3    2  0  1
#12:  3    3  0  1
#13:  4    1  1  0
#14:  4    2  1  0
#15:  5    1  1  0
#16:  5    2  0  1
#17:  5    3  1  0

数据

ID<-c("1","1","1","1","1","2","2","2","2","3","3","3","4","4","5","5","5")
time<-c("1","2","3","4","5","1","2","3","4","1","2","3","1","2","1","2","3")
x1<- as.integer(c("0","1","1","1","1","0","0","0","0","1","0","0","1","1","1","0","1"))
df<-data.frame(ID,time,x1)

答案 1 :(得分:0)

如果您想要dplyr答案,可以在按ID分组后在mutate中使用@ akrun代码

library(dplyr)

ID<-c("1","1","1","1","1","2","2","2","2","3","3","3","4","4","5","5","5")
time<-c("1","2","3","4","5","1","2","3","4","1","2","3","1","2","1","2","3")
x1<- as.integer(c("0","1","1","1","1","0","0","0","0","1","0","0","1","1","1","0","1"))
df<-data.frame(ID,time,x1)

df <- df %>%
  group_by(ID) %>%
  mutate(x2 = (cumsum(x1) < 2)*cumsum(c(FALSE, diff(x1) < 0)))

df
# ID   time    x1    x2
# 1      1     0     0
# 1      2     1     0
# 1      3     1     0
# 1      4     1     0
# 1      5     1     0
# 2      1     0     0
# 2      2     0     0
# 2      3     0     0
# 2      4     0     0
# 3      1     1     0
# 3      2     0     1
# 3      3     0     1
# 4      1     1     0
# 4      2     1     0
# 5      1     1     0
# 5      2     0     1
# 5      3     1     0