在 R 中使用 lag 和 mutate 命令创建迭代函数
Creating an iterative function using lag and mutate command in R
我有一个数据集DF,数据如下
Zone
Year
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
所以它创建了以下 Table:
Zone
Year
X
Y
Z
1001
2018
10
5
NA
1001
2019
20
10
25
1001
2020
30
20
40
1002
2018
15
10
NA
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, 1001L, 1002L, 1002L, 1002L
), Year = c(2018L, 2019L, 2020L, 2018L, 2019L, 2020L), X = c(10L,
20L, 30L, 15L, 25L, 35L), Y = c(5L, 10L, 20L, 10L, 20L, 40L)),
class = "data.frame", row.names = c(NA, -6L))
使用data.table
library(data.table)
setDT(DF)[, Z := X + Y - shift(Y), Zone]
我有一个数据集DF,数据如下
Zone | Year | 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 所以它创建了以下 Table:
Zone | Year | X | Y | Z |
---|---|---|---|---|
1001 | 2018 | 10 | 5 | NA |
1001 | 2019 | 20 | 10 | 25 |
1001 | 2020 | 30 | 20 | 40 |
1002 | 2018 | 15 | 10 | NA |
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, 1001L, 1002L, 1002L, 1002L
), Year = c(2018L, 2019L, 2020L, 2018L, 2019L, 2020L), X = c(10L,
20L, 30L, 15L, 25L, 35L), Y = c(5L, 10L, 20L, 10L, 20L, 40L)),
class = "data.frame", row.names = c(NA, -6L))
使用data.table
library(data.table)
setDT(DF)[, Z := X + Y - shift(Y), Zone]