我的出發條件是這樣的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