基于r中的第三列将值及时复制到下一行

基于r中的第三列将值及时复制到下一行,r,if-statement,dplyr,lag,shift,R,If Statement,Dplyr,Lag,Shift,我正试图根据我拥有的数据创建一个新列smk_R。对于每个ID变量,随着时间的推移,我有两种类型的数据。类型1数据是我的锚,将保留以供以后分析使用。类型0行中的信息也很重要,应该稍后在每个ID内推送到下一个类型1行。基本上,我想看看人们是否在两次类型1评估之间吸烟(smk=0表示否,smk=1表示是)。如果有,下一次1型评估应表明smk_R=1,即使在该特定1型评估中smk=0。任何关于如何做到这一点的想法都将不胜感激。我的数据中没有变量grp,但如果可以从dat1创建变量grp,我想我可以取组内

我正试图根据我拥有的数据创建一个新列smk_R。对于每个ID变量,随着时间的推移,我有两种类型的数据。类型1数据是我的锚,将保留以供以后分析使用。类型0行中的信息也很重要,应该稍后在每个ID内推送到下一个类型1行。基本上,我想看看人们是否在两次类型1评估之间吸烟(smk=0表示否,smk=1表示是)。如果有,下一次1型评估应表明smk_R=1,即使在该特定1型评估中smk=0。任何关于如何做到这一点的想法都将不胜感激。我的数据中没有变量grp,但如果可以从dat1创建变量grp,我想我可以取组内smk的最大值来获得smk_R

ID<-c(5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9)
time<-c(0.16,0.35,0.72,1.17,1.19,1.19,1.65,1.99,2.2,2.37,2.78,3.57,3.88,4.12,0.29,0.35,0.79,1.17,1.29,1.29,1.75,1.96,2.27,2.57,2.78,3.57,4.88,5.12)
type<-c(0,1,0,1,0,1,0,0,0,0,0,1,1,1,0,1,0,1,0,1,0,0,0,0,0,1,1,1)
smk<-c(1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,1)
grp<-c(1,1,2,2,3,3,4,4,4,4,4,4,5,6,1,1,2,2,3,3,4,4,4,4,4,4,5,6)
smk_R<-c(1,1,0,0,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,0,0,1,1)

dat1<-cbind.data.frame(ID,time,type,smk)
dat1

   ID time type smk
1   5 0.16    0   1
2   5 0.35    1   0
3   5 0.72    0   0
4   5 1.17    1   0
5   5 1.19    0   0
6   5 1.19    1   1
7   5 1.65    0   1
8   5 1.99    0   1
9   5 2.20    0   1
10  5 2.37    0   0
11  5 2.78    0   0
12  5 3.57    1   0
13  5 3.88    1   0
14  5 4.12    1   0
15  9 0.29    0   1
16  9 0.35    1   0
17  9 0.79    0   0
18  9 1.17    1   0
19  9 1.29    0   0
20  9 1.29    1   1
21  9 1.75    0   0
22  9 1.96    0   0
23  9 2.27    0   0
24  9 2.57    0   0
25  9 2.78    0   0
26  9 3.57    1   0
27  9 4.88    1   1
28  9 5.12    1   1

dat2<-cbind.data.frame(dat1,grp,smk_R)
dat2
    ID time type smk grp smk_R
 1   5 0.16    0   1   1     1
 2   5 0.35    1   0   1     1
 3   5 0.72    0   0   2     0
 4   5 1.17    1   0   2     0
 5   5 1.19    0   0   3     1
 6   5 1.19    1   1   3     1
 7   5 1.65    0   1   4     1
 8   5 1.99    0   1   4     1
 9   5 2.20    0   1   4     1
 10  5 2.37    0   0   4     1
 11  5 2.78    0   0   4     1
 12  5 3.57    1   0   4     1
 13  5 3.88    1   0   5     0
 14  5 4.12    1   0   6     1
 15  9 0.29    0   1   1     1
 16  9 0.35    1   0   1     1
 17  9 0.79    0   0   2     0
 18  9 1.17    1   0   2     0
 19  9 1.29    0   0   3     1
 20  9 1.29    1   1   3     1
 21  9 1.75    0   0   4     0
 22  9 1.96    0   0   4     0
 23  9 2.27    0   0   4     0
 24  9 2.57    0   0   4     0
 25  9 2.78    0   0   4     0
 26  9 3.57    1   0   4     0
 27  9 4.88    1   1   5     1
 28  9 5.12    1   1   6     1

ID在评论中添加内容看起来是个不错的方法。然后你可以做(例如):

库(dplyr)
dat2%
排列(ID、时间、类型)%>%
分组依据(ID)%>%
突变(grp=cumsum(c(1,类型[-n())))%>%
分组依据(ID,grp)%>%
突变(smk_R=max(smk))
as.data.frame(dat2)

您要求执行一项非常具体、令人困惑的任务,并要求我们为您编写代码。你能把你的问题归结到你遇到问题的确切位置吗(即,你自己不能做哪一件事)?@wtrs我添加了另一个专栏,这可能是一个中间步骤。如果可以从dat1创建一个新的分组变量,我可以在每个ID中取每个组中的最大smk值,以获得smk\u R。每次出现type=1评估时,前一个组结束,新组开始。这是一个不错的解决方案!也许
mutate(grp=cumsum(type)+1)
可能比
mutate(grp=cumsum(c(1,type[-n()]))更不神秘。
。此外,使用此解决方案,您不仅可以查看作业之间发生的情况,还可以查看作业中发生的情况。如果赋值之间的smk始终为0(当类型==0时),则如果赋值处的smk==1(当类型==1时),smk_R将为1。这可能是正确的,但@swhusky所期望的确切结果并不那么明确nicer@Gilles如果每个新组从类型1分配开始,这也很有用。然而,从示例中的预期结果来看,当出现类型1评估时,每组结束,这就是罗兰达斯克的答案。
library(dplyr)

dat2 <- dat1 %>%
  arrange(ID, time, type) %>%
  group_by(ID) %>%
  mutate(grp = cumsum(c(1, type[-n()]))) %>%
  group_by(ID, grp) %>%
  mutate(smk_R = max(smk))

as.data.frame(dat2)