微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 R 中使用 lag 和 mutate 命令创建迭代函数

如何解决在 R 中使用 lag 和 mutate 命令创建迭代函数

我有一个包含以下数据的数据集 DF

区域 X Y
1001 2018 10 5
1001 2019 20 10
1001 2020 30 20
1002 2018 15 10
1002 2019 25 20
1002 2020 35 40

我想创建一个列 Z = X + Y - 上一年的 Y 所以它创建了下表:

区域 X Y Z
1001 2018 10 5 不适用
1001 2019 20 10 25
1001 2020 30 20 40
1002 2018 15 10 不适用
1002 2019 25 20 35
1002 2020 35 40 55

我可以使用 dplYR 中的“mutate”来生成列 Z: 变异(DF,Z = X + Y - 滞后(Y))

我可以使用 tapply 在 DF 上递归应用。我可以在用户定义的函数中使用 dplYR 创建一个函数,以便稍后使用 tapply 应用它吗?

解决方法

dplyr 中,您可以添加 group_by 来为每个组 (Zone) 应用一个函数。

library(dplyr)
DF %>% group_by(Zone) %>% mutate(Z = X + Y - lag(Y))

#   Zone  Year     X     Y     Z
#  <int> <int> <int> <int> <int>
#1  1001  2018    10     5    NA
#2  1001  2019    20    10    25
#3  1001  2020    30    20    40
#4  1002  2018    15    10    NA
#5  1002  2019    25    20    35
#6  1002  2020    35    40    55

我们也可以写一个函数:

add_new_col = function(x,y) {
  x + y - lag(y)
}

可以用作:

DF %>% group_by(Zone) %>% mutate(Z = add_new_col(X,Y))

数据

DF <- structure(list(Zone = c(1001L,1001L,1002L,1002L
),Year = c(2018L,2019L,2020L,2018L,2020L),X = c(10L,20L,30L,15L,25L,35L),Y = c(5L,10L,40L)),class = "data.frame",row.names = c(NA,-6L))
,

使用 data.table

library(data.table)
setDT(DF)[,Z := X + Y - shift(Y),Zone]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。