【发布时间】:2013-12-08 21:12:01
【问题描述】:
我的起始条件类似于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,您始终拥有一组至少两个连续且已排序的年份的数据?如果是这样,我可以展示一个简短的矢量化解决方案。 -
@musically_ut 非常感谢您的评论。你完全正确。仍然不起作用的是哪个功能。你知道为什么吗?
标签: r for-loop if-statement