我正試圖計算在不同巢的小雞訪問之間的重量變化。這要求R在當前行中查找嵌套代碼,查找上次訪問嵌套的時間,並從當前訪問中減去上次訪問時的權重。對於每個巢穴的第一次訪問,我想輸出當前的重量(即,好像之前不存在的訪問的重量爲零)。引用data.frame的前一行來計算R中的新列
我的數據的形式爲:
Nest <- c(a,b,c,d,e,c,b,c)
Weight <- c(2,4,3,3,2,6,8,10)
df <- data.frame(Nest, Weight)
所以這裏所需的輸出將是:
Change <- c(2,4,3,3,2,3,4,4)
我已經達到了預期的輸出一次,由子集到一個窩,並用for循環:
tmp <- subset(df, Nest == "a")
tmp$change <- tmp$Weight
for(x in 2:(length(tmp$Nest))){
tmp$change[x] <- tmp$Weight[(x)] - tmp$Weight[(x-1)]
}
但是當我嘗試以適應ddply
這個df2 <- ddply(df, "Nest", function(f) {
f$change <- f$Weight
for(x in 2:(length(f$Nest))){
f$change <- f$Weight[(x)] - f$Weight[(x-1)]
}
})
輸出給出一個空白data.frame(0 obs。 0個變量)。
我接近這個正確的方法,但得到的代碼錯了嗎?還是有更好的方法來做到這一點?
在此先感謝!
哇,真是太神奇了。感謝您的快速響應,立即解決了問題! – Andrew 2014-12-01 16:32:56
它在'Nest'中爲每個唯一的'nst'計算'FUN(權重[Nest == nst])',將輸出安排在一個新列'Change'中。 – 2014-12-04 14:09:12
我試過在第二個選項中使用代碼來應用於類似的問題,但它不工作。 這次,我試圖返回兩次訪問之間的平均育雛大小的列,從而如果沒有從'x [1]'到'x [2]'的變化,則返回'x [2]' ,但如果有變化,則返回'x [1]'和'x [2]'的意思。我已經嘗試過'ifelse'和'for'循環,但無濟於事。 (i = 2,長度(Nest)){ifelse(x [i] = 1),其中, = x [i-1],x [i],(x [i] + x [i-1])/ 2)})))' 我看不出爲什麼這不起作用。謝謝! – Andrew 2014-12-04 14:12:04