【问题标题】:Referencing previous rows of a data.frame to compute a new column in R引用 data.frame 的前几行来计算 R 中的新列
【发布时间】:2014-12-01 15:52:20
【问题描述】:

我正在尝试计算访问不同巢穴的小鸡之间的体重变化。这需要 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 个变量)。

我是否以正确的方式接近此问题,但代码错误?还是有更好的方法?

提前致谢!

【问题讨论】:

    标签: r for-loop plyr


    【解决方案1】:

    试试这个:

    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))))
    

    【讨论】:

    • 哇,太棒了。感谢您这么快的回复,立即解决了问题!
    • 它为Nest 中的每个唯一nst 计算FUN(Weight[Nest == nst]),并将输出安排在新列Change 中。
    • 我尝试使用第二个选项中的代码来解决类似的问题,但它不起作用。这一次,我试图在两次访问之间返回一列平均育雏大小,如果从 x[1]x[2] 没有变化,则返回 x[2],但如果有变化,则意味着x[1]x[2] 被返回。我已经用ifelsefor 循环尝试过这个,但无济于事。 df &lt;- transform(df, Change = ave(Brood, Nest, FUN = function(x) c(x[1], for(i in 2:length(Nest)){ifelse(x[i]==x[i-1], x[i], (x[i]+x[i-1])/2)}))) 我不明白为什么这不起作用。谢谢!
    【解决方案2】:

    这是一个 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
    

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2022-01-14
      • 2011-10-28
      相关资源
      最近更新 更多