【问题标题】:Calculating difference of successive column values group by another column计算连续列值的差异按另一列分组
【发布时间】:2015-12-05 11:19:53
【问题描述】:

以下是我的数据框的前 4 行。我有美国各州的数据。所以我有每个州的 4 条记录,即 4 年的年度排放测量

states_fp  year total_emissions
(chr) (int)           (dbl)
2        01  1999       25226.298
3        01  2002       22883.223
4        01  2005       23855.563
5        01  2008        2803.835

我想添加一个包含增量的列。即与上一年的差异。

states_fp  year total_emissions    difference
(chr) (int)           (dbl)
2        01  1999       25226.298   0
3        01  2002       22883.223   -2343.075
4        01  2005       23855.563   972.34
5        01  2008        2803.835   -21051.728

我想要一个 dplyr 解决方案。

states_fp  year total_emissions
(chr) (int)           (dbl)
1         01  1999      25226.2980
2         01  2002      22883.2235
3         01  2005      23855.5635
4         01  2008       2803.8350
5         02  1999       1179.7820
6         02  2002       1256.3100
7         02  2005        871.3000
8         02  2008        200.1777
9         04  1999       6358.7810
10        04  2002       7020.6206

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    为什么不像这样添加一个新列?

    DF$difference <- append(diff(DF$total_emissions, lag = 1, differences = 1), 0, after = 0)
    

    不需要 dplyr

    这是一个简短的变体:

    DF$difference <- c(0, diff(DF$total_emissions))
    

    在大多数情况下,最好使用NA 作为第一个区别。这通常可以防止以后计算一些奇怪的东西。如果你想这样使用:c(NA, diff(...))

    为每个州都这样做:

    my.diff <- function(x) c(0, diff(x))
    DF$difference <- ave(DF$total_emissions, DF$states_fp, FUN=my.diff)
    

    (使用其他数据和您的新数据进行测试)

    【讨论】:

    • 我需要为每个州都这样做。即每个州的 1999 年都应该为零。之后我可以通过将 1999 年的所有行设置为零来进行调整,但我想学习如何做到这一点...
    • 1.从答案中创建一个函数。 2.使用ave(DF$total_emissions, DF$state_fp, FUN=...)
    • 当我尝试 split.default(x, g) 时出现此错误:组长度为 0 但数据长度 > 0
    • 对我来说这是可行的:my.diff &lt;- function(x) c(0, diff(x)); DF &lt;- iris; DF$difference &lt;- ave(DF$Sepal.Length, DF$Species, FUN=my.diff)
    • DF$difference &lt;- ave(DF$total_emissions, DF$states_fp, FUN=my.diff) 打错了
    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2020-05-07
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多