2014-12-01 60 views
2

我正試圖計算在不同巢的小雞訪問之間的重量變化。這要求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個變量)。

我接近這個正確的方法,但得到的代碼錯了嗎?還是有更好的方法來做到這一點?

在此先感謝!

回答

4

嘗試這種情況:

library(dplyr) 
df %>% group_by(Nest) %>% mutate(Change = c(Weight[1], diff(Weight))) 

或者與R

transform(df, Change = ave(Weight, Nest, FUN = function(x) c(x[1], diff(x)))) 
+1

哇,真是太神奇了。感謝您的快速響應,立即解決了問題! – Andrew 2014-12-01 16:32:56

+2

它在'Nest'中爲每個唯一的'nst'計算'FUN(權重[Nest == nst])',將輸出安排在一個新列'Change'中。 – 2014-12-04 14:09:12

+0

我試過在第二個選項中使用代碼來應用於類似的問題,但它不工作。 這次,我試圖返回兩次訪問之間的平均育雛大小的列,從而如果沒有從'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

1

這裏只是鹼是data.table溶液。對於大數據集,這可能會更快。

library(data.table) 
setDT(df)[,Change:=c(Weight[1],diff(Weight)),by=Nest] 
df 
# Nest Weight Change 
# 1: a  2  2 
# 2: b  4  4 
# 3: c  3  3 
# 4: d  3  3 
# 5: e  2  2 
# 6: c  6  3 
# 7: b  8  4 
# 8: c  10  4 
相關問題