我的出发条件是这样的df
数据帧条件列创建(水平和垂直条件)
df<-data.frame(id=c(rep(2, 3), rep(4, 2)), year=c(2005:2007, 2005:2006), event=c(1,0,0,0,1))
id year event
1 2 2005 1
2 2 2006 0
3 2 2007 0
4 4 2005 0
5 4 2006 1
我有一系列谁发生在一个特定体验事件参与者(通过ID标识)的年。
这里我试图建立的是一系列额外的列,描述a)事件的距离和b)这样的距离是否可观察。
这是我想获得的。
id year event evm2 evm1 evp1 evp2 ndm2 ndm1 ndp1 ndp2
1 2 2005 1 0 0 0 0 1 1 0 0
2 2 2006 0 0 1 0 0 1 0 0 1
3 2 2007 0 1 0 0 0 0 0 1 1
4 4 2005 0 0 0 1 0 1 1 0 1
5 4 2006 1 0 0 0 0 1 0 1 1
event
等于1当某年某事发生时。 evm1
等于1当事件在前一年可观察到时。类似地,evp1
在事件发生在下一年时为1,字母p
或m
代表“加号”和“减号”,数字代表距离事件的年数。 对于其中一些观测值,由于可用时间窗太短,距离不可观测。这是df[1,]
的情况,我们不知道前几年是否发生了事件。在这种情况下,ndm1
和ndm2
进行编码1.如果我们考虑的情况下df[5,]
,这将是ndp1
(和ndp2
)进行编码1. ev
和nd
变量以相同的方式工作完全。但是前者告诉我们在一定距离内是否存在事件,而后者揭示这种距离是否实际可观察到。
我试图用下面的嵌套for循环来实现这个,但是我没有成功。
lag<-c(-2, -1, 1, 2)
df2<-df
df2[,4:11]<-0
colnames(df2)<-c("id", "year", "event", "evm2", "evm1", "evp1", "evp2", "ndm2", "ndm1", "ndp1", "ndp2")
for (i in length(df2$id)) {
id<-df2[i,1]
yr<-df2[i,2]
sta<-3
sta2<-7
for (j in lag){
sta<-sta+1
sta2<-sta2+1
if !is.null(df2[df2$id==id & df2$year==yr+j])==TRUE {
rw<-which(df2[df2$id==id & df2$year==yr+j])
if (df2[rw,3]==1) df2[i, sta]==1
} else {
df2[i, sta2]==1
}
}
}
您是否看到任何可能导致错误的原因?我已经疯了两天试图让它工作,如果你能帮忙,我会非常感激。
你错过了围绕'if'条件的括号是第一件事。你不需要用'TRUE'来测试它是否相等。它应该是:'if(!is.null(df2 [df2 $ id == id&df2 $ year == yr + j]))'但是,我不确定这是唯一的问题。 –
假设对于给定的“id”,你总是有一组至少两个连续和排序的年份的数据是安全的吗?如果是这样,我可以展示一个简短的向量化解决方案。 – flodel
@musically_ut非常感谢您的评论。你是完全正确的。仍然不起作用的是那个函数。你知道为什么吗? – Riccardo