rollapplyr()仅创建一个新列,而不为.SDcols中的每一列创建多个列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rollapplyr()仅创建一个新列,而不为.SDcols中的每一列创建多个列相关的知识,希望对你有一定的参考价值。
我正在尝试在数据表上使用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)的数据表。有没有办法获得后者?
答案
您可以尝试:
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')]
以上是关于rollapplyr()仅创建一个新列,而不为.SDcols中的每一列创建多个列的主要内容,如果未能解决你的问题,请参考以下文章
播放预编译命令仅在预编译文件夹中生成一个类文件,而不为控制器、模型等生成类文件
如何删除一列并创建一个新列而不是在 EF Core 中重命名?