[英]Referencing previous rows of a data.frame to compute a new column in R
我正在尝试计算在不同巢穴访问小鸡之间的体重变化。 这要求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个变量,共0个变量)。
我是否以正确的方式处理此错误,但是却弄错了代码? 还是有更好的方法呢?
提前致谢!
尝试这个:
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))))
这是一个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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.