2013-12-08 34 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

相關問題