【问题标题】:How to take the mean of values between a range of rows in R?如何取R中一系列行之间的平均值?
【发布时间】:2013-11-09 00:55:14
【问题描述】:

这是去年在此网站上为我成功回答的问题的后续问题,请参阅How to take the mean of last 10 values in a column before a missing values using R

之前,我曾问过如何在缺失值之前取一列中最后 10 行的平均值。我的数据是树木的增长率——我的第一列是年份,右边的列是单棵树的增长率,以每棵树死亡的那一年结束。在每棵树“出生”之前和树死之后,增长率值为NA。当我需要在每棵树死亡前取过去 10 年的平均值时,有效的代码是:

sapply(dataframe, function(dataframe) mean(tail(na.omit(dataframe), 10)))

后来,我需要计算每棵树生命前 50 年的平均增长率,所以我用“头”代替“尾”来做到这一点,使用以下代码:

sapply(dataframe, function(dataframe) mean(head(na.omit(dataframe), 50)))

现在,我的问题是:我如何取每棵树在前 50 年到 100 年生长之间生长的平均值?那么,我想要每棵树在 50 到 100 年之间的平均生长情况?是否有一个我不知道的函数(类似于“head”或“tail”)可以让我在特定行之间取平均值?困难在于每棵树在不同年份出生(或死亡),所以我不能简单地索引某些年份。

感谢您提供的任何帮助。

凯蒂

【问题讨论】:

    标签: r


    【解决方案1】:

    结合headtail 可以满足您的需求。例如:

    > x<-1:10
    > tail(head(x,4),2)
    [1] 3 4
    

    所以在你的情况下,你想要的是:

    sapply(dataframe, function(x) mean(tail(head(na.omit(x), 100),50)))
    

    如果需要,您也可以使用显式索引,因为 na.omit 将删除所有 NA 值,因此 na.omit(x)[51:100] 将是自一棵树诞生以来的 51-100 年。所以你也可以去

    sapply(dataframe, function(x) mean(na.omit(x)[51:100]))
    

    两者之间的唯一区别是如果一列的有效条目少于 100 个会发生什么。在这种情况下,head/tail 方法将为您提供最后 50 个有效条目的平均值(或更少,如果总数少于 50 个),而 51:100 方法将返回 NA。

    【讨论】:

    • 谢谢!两种解决方案都按预期工作,我使用了您的索引修复 (na.omit(x)[51:100],因为我确实有一些生长不到 100 年的树。
    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2022-01-14
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多