【问题标题】:How to take the mean of last 10 values in a column before a missing value using R?如何在使用 R 的缺失值之前获取列中最后 10 个值的平均值?
【发布时间】:2012-12-07 01:36:30
【问题描述】:

我是 R 新手,无法解决这个问题。我有按年份组织的死树的树木生长率数据。所以,我的第一列是年份,右边的列是单棵树的增长率,以每棵树死亡的年份结束。树死后,数据集中剩余年份的值为“NA”。我需要取每棵树死亡前 10 年的平均增长,但每棵树在不同的年份死亡。有谁知道如何做到这一点?以下是数据集的示例:

Year    Tree1   Tree2   Tree3
1989    53.00   84.58   102.52
1990    63.68   133.16  146.07
1991    90.37   103.10  233.58
1992    149.24  127.61  245.69
1993    96.20   54.78   417.96
1994    230.64  60.92   125.31
1995    150.81  60.98   100.43
1996    124.25  42.73   75.43
1997    173.42  67.20   50.34
1998    119.60  73.40   32.43
1999    179.97  61.24   NA
2000    114.88  67.43   NA
2001    82.23   55.23   NA
2002    49.40   NA  NA
2003    93.46   NA  NA
2004    104.67  NA  NA
2005    44.14   NA  NA
2006    88.40   NA  NA

所以,我需要计算的平均值是:

Tree1: mean(1997-2006) = 105.01
Tree2: mean(1992-2001) = 67.15
Tree3: mean(1989-1998) = 152.98

由于我需要对大量树执行此操作,因此拥有一种自动计算的方法会很有帮助。非常感谢您的帮助!凯蒂

【问题讨论】:

  • 我还没有尝试过任何东西......我对 R 很陌生,以至于我不知道从哪里开始。通过几个相关的问题,我想知道 rollmean 或 tapply 是否可以作为起点?
  • 在这棵树活着的那几年里肯定不会有NA 值?

标签: r moving-average


【解决方案1】:

您可以将sapplytailna.omit 一起使用,如下所示:

sapply(mydf[-1], function(x) mean(tail(na.omit(x), 10)))
#   Tree1   Tree2   Tree3 
# 105.017  67.152 152.976 

mydf[-1] 表示删除第一列。 tail 有一个参数,n,它允许您从数据的 end(尾部)指定需要多少个值。在这里,我们将其设置为“10”,因为您需要最后 10 个值。然后,假设在树还活着的时候,您的实际数据中没有 NA 值,您可以安全地在数据上使用 na.omit

【讨论】:

  • 非常感谢。这正是我所希望的,并将为我节省大量时间来自动化这些计算。我非常感谢您在这方面的帮助,因为我怀疑我是否会自己解决这个问题。而且,是的,当树木还活着时,我的实际数据中没有 NA 值……他们已经过检查。谢谢!凯蒂
  • 应该是mydf[,-1]
  • @CarlWitthoft mydf[-1] == mydf[,-1]
  • @CarlWitthoft,如果mydfmatrix,我认为您的评论适用,但是在这里,我假设因为它被称为“mydf”,所以它是data.frame
  • @BrandonBertelsen,对于 data.frame,是的,但对于 matrix,不是。卡尔的建议是一个很好的一致性建议(但我并不总是一致)。
猜你喜欢
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
相关资源
最近更新 更多