2013-12-08 23 views
3

我的出发条件是这样的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,字母pm代表“加号”和“减号”,数字代表距离事件的年数。 对于其中一些观测值,由于可用时间窗太短,距离不可观测。这是df[1,]的情况,我们不知道前几年是否发生了事件。在这种情况下,ndm1ndm2进行编码1.如果我们考虑的情况下df[5,],这将是ndp1(和ndp2)进行编码1. evnd变量以相同的方式工作完全。但是前者告诉我们在一定距离内是否存在事件,而后者揭示这种距离是否实际可观察​​到。

我试图用下面的嵌套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 

    } 

    } 

} 

您是否看到任何可能导致错误的原因?我已经疯了两天试图让它工作,如果你能帮忙,我会非常感激。

+0

你错过了围绕'if'条件的括号是第一件事。你不需要用'TRUE'来测试它是否相等。它应该是:'if(!is.null(df2 [df2 $ id == id&df2 $ year == yr + j]))'但是,我不确定这是唯一的问题。 –

+0

假设对于给定的“id”,你总是有一组至少两个连续和排序的年份的数据是安全的吗?如果是这样,我可以展示一个简短的向量化解决方案。 – flodel

+0

@musically_ut非常感谢您的评论。你是完全正确的。仍然不起作用的是那个函数。你知道为什么吗? – Riccardo

回答

3

按照我的意见,这里是我脑子里作为一个潜在的改写:

lag.it <- function(x, n = 0L) { 
    l <- length(x) 
    neg.lag <- min(max(0L, -n), l) 
    pos.lag <- min(max(0L, +n), l) 
    c(rep(NA, +neg.lag), 
    head(x, -neg.lag), 
    tail(x, -pos.lag), 
    rep(NA, +pos.lag)) 
} 

library(plyr) 
ddply(df, "id", transform, 
     evm2 = lag.it(event, -2), 
     evm1 = lag.it(event, -1), 
     evp1 = lag.it(event, +1), 
     evp2 = lag.it(event, +2)) 

# id year event evm2 evm1 evp1 evp2 
# 1 2 2005  1 NA NA 0 0 
# 2 2 2006  0 NA 1 0 NA 
# 3 2 2007  0 1 0 NA NA 
# 4 4 2005  0 NA NA 1 NA 
# 5 4 2006  1 NA 0 NA NA 

注意我是如何使用的,而不是使用两组变量NA秒。虽然我建议您这样保留,但您可以通过定义例如ndm2 as is.na(evm2)然后用零代替NA s。

+0

我真的认为这个解决方案是天才。这很聪明,我可能完全不理解它(特别是我不明白neg.lag和pos.lag的定义)。你介意给我解释一下吗?为了回答你上面的问题,我观察到的一些观察结果超过7年,而其他观察结果只能在更短的时间内观察到,其中一些只有1年。无论如何,我会考虑一个+/- 2年的滞后时间来创造额外的变量。非常感谢您的帮助。 – Riccardo

+1

根据延迟'n'的符号(正数或负数),您需要在矢量的开头或结尾添加(正数)“NA”。这就是为什么我依赖两个变量'neg.lag'和'pos.lag',但是根据定义,这两个变量中只有一个变为非零。很高兴你喜欢这个解决方案。如果它解决了您的问题,请考虑投票并接受它。 – flodel

+0

接受解决方案。我已经投票了。一个非常小的细节仍然不清楚。你为什么写0L而不是简单地写0?再次感谢。 R编码风格的一个很好的教训。 – Riccardo

相关问题