繁体   English   中英

引用data.frame的前几行以计算R中的新列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM