rollapplyr() 只为 .SDcols 中的每一列创建一个新列而不是多个列
rollapplyr() creates only one new column instead of multiple columns for each column in .SDcols
我正在尝试对数据 table 使用 rollapplyr()
并通过 .SDcols
使用它生成各种列。然而,rollapplyr()
不是将一列的结果放在另一列的结果旁边,而是将每一列的结果堆叠在另一列之下。下面一些代码来说明我的意思:
library(data.table)
library(zoo)
cars <- data.table(mtcars)[, c('cyl', 'mpg', 'hp')]
setorder(cars, cyl)
maCols <- c('mpg_ma', 'hp_ma')
cars[, rollapplyr(.SD, mean, width = 3, align = 'right', partial = TRUE),
by = cyl,
.SDcols = c('mpg', 'hp')]
此代码生成 64 行的两列(cyl 和 V1)的 data.table,而不是 32 列的三列(cyl、V1 和 V2)的数据 table。有没有办法获得后者?
你可以试试:
cars[, lapply(.SD, function(x) rollapplyr(x, mean, width = 3, align = 'right', partial = TRUE)),
by = cyl,
.SDcols = c('mpg', 'hp')]
输出:
cyl mpg hp
1: 4 22.80000 93.00000
2: 4 23.60000 77.50000
3: 4 23.33333 83.33333
4: 4 26.53333 74.33333
5: 4 28.53333 71.00000
6: 4 32.23333 61.00000
7: 4 28.60000 71.33333
8: 4 27.56667 76.00000
9: 4 24.93333 84.66667
10: 4 27.90000 90.00000
11: 4 25.93333 104.33333
12: 6 21.00000 110.00000
13: 6 21.00000 110.00000
14: 6 21.13333 110.00000
15: 6 20.16667 108.33333
16: 6 19.56667 112.66667
17: 6 18.36667 117.00000
18: 6 18.90000 140.33333
19: 8 18.70000 175.00000
20: 8 16.50000 210.00000
21: 8 16.46667 200.00000
22: 8 16.00000 201.66667
23: 8 16.30000 180.00000
24: 8 14.30000 188.33333
25: 8 12.00000 200.00000
26: 8 11.83333 216.66667
27: 8 13.53333 198.33333
28: 8 15.13333 176.66667
29: 8 14.66667 181.66667
30: 8 15.90000 190.00000
31: 8 16.10000 228.00000
32: 8 16.66667 258.00000
使用 lapply
循环遍历 .SDcols
中的选定列,并使用 maCols
将值分配给。
cars[, (maCols) := lapply(.SD, function(x)
zoo::rollapplyr(x, mean, width = 3, align = 'right', partial = TRUE)),
by = cyl,
.SDcols = c('mpg', 'hp')]
cars
# cyl mpg hp mpg_ma hp_ma
# 1: 4 22.8 93 22.8 93.0
# 2: 4 24.4 62 23.6 77.5
# 3: 4 22.8 95 23.3 83.3
# 4: 4 32.4 66 26.5 74.3
# 5: 4 30.4 52 28.5 71.0
# 6: 4 33.9 65 32.2 61.0
# 7: 4 21.5 97 28.6 71.3
# 8: 4 27.3 66 27.6 76.0
# 9: 4 26.0 91 24.9 84.7
#10: 4 30.4 113 27.9 90.0
#....
问题是 rollapplyr
生成一个矩阵,而 data.table 需要一个列表,data.frame 或 data.table。只需转换它,你应该没问题。此外,如果您使用 rollapplyr
并在末尾添加 r
,则不需要 align = "right"
。
cars[, as.data.table(rollapplyr(.SD, mean, width = 3, partial = TRUE)),
by = cyl,
.SDcols = c('mpg', 'hp')]
我正在尝试对数据 table 使用 rollapplyr()
并通过 .SDcols
使用它生成各种列。然而,rollapplyr()
不是将一列的结果放在另一列的结果旁边,而是将每一列的结果堆叠在另一列之下。下面一些代码来说明我的意思:
library(data.table)
library(zoo)
cars <- data.table(mtcars)[, c('cyl', 'mpg', 'hp')]
setorder(cars, cyl)
maCols <- c('mpg_ma', 'hp_ma')
cars[, rollapplyr(.SD, mean, width = 3, align = 'right', partial = TRUE),
by = cyl,
.SDcols = c('mpg', 'hp')]
此代码生成 64 行的两列(cyl 和 V1)的 data.table,而不是 32 列的三列(cyl、V1 和 V2)的数据 table。有没有办法获得后者?
你可以试试:
cars[, lapply(.SD, function(x) rollapplyr(x, mean, width = 3, align = 'right', partial = TRUE)),
by = cyl,
.SDcols = c('mpg', 'hp')]
输出:
cyl mpg hp
1: 4 22.80000 93.00000
2: 4 23.60000 77.50000
3: 4 23.33333 83.33333
4: 4 26.53333 74.33333
5: 4 28.53333 71.00000
6: 4 32.23333 61.00000
7: 4 28.60000 71.33333
8: 4 27.56667 76.00000
9: 4 24.93333 84.66667
10: 4 27.90000 90.00000
11: 4 25.93333 104.33333
12: 6 21.00000 110.00000
13: 6 21.00000 110.00000
14: 6 21.13333 110.00000
15: 6 20.16667 108.33333
16: 6 19.56667 112.66667
17: 6 18.36667 117.00000
18: 6 18.90000 140.33333
19: 8 18.70000 175.00000
20: 8 16.50000 210.00000
21: 8 16.46667 200.00000
22: 8 16.00000 201.66667
23: 8 16.30000 180.00000
24: 8 14.30000 188.33333
25: 8 12.00000 200.00000
26: 8 11.83333 216.66667
27: 8 13.53333 198.33333
28: 8 15.13333 176.66667
29: 8 14.66667 181.66667
30: 8 15.90000 190.00000
31: 8 16.10000 228.00000
32: 8 16.66667 258.00000
使用 lapply
循环遍历 .SDcols
中的选定列,并使用 maCols
将值分配给。
cars[, (maCols) := lapply(.SD, function(x)
zoo::rollapplyr(x, mean, width = 3, align = 'right', partial = TRUE)),
by = cyl,
.SDcols = c('mpg', 'hp')]
cars
# cyl mpg hp mpg_ma hp_ma
# 1: 4 22.8 93 22.8 93.0
# 2: 4 24.4 62 23.6 77.5
# 3: 4 22.8 95 23.3 83.3
# 4: 4 32.4 66 26.5 74.3
# 5: 4 30.4 52 28.5 71.0
# 6: 4 33.9 65 32.2 61.0
# 7: 4 21.5 97 28.6 71.3
# 8: 4 27.3 66 27.6 76.0
# 9: 4 26.0 91 24.9 84.7
#10: 4 30.4 113 27.9 90.0
#....
问题是 rollapplyr
生成一个矩阵,而 data.table 需要一个列表,data.frame 或 data.table。只需转换它,你应该没问题。此外,如果您使用 rollapplyr
并在末尾添加 r
,则不需要 align = "right"
。
cars[, as.data.table(rollapplyr(.SD, mean, width = 3, partial = TRUE)),
by = cyl,
.SDcols = c('mpg', 'hp')]