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中的每一列创建多个列的主要内容,如果未能解决你的问题,请参考以下文章

播放预编译命令仅在预编译文件夹中生成一个类文件,而不为控制器、模型等生成类文件

根据与另一列的部分匹配创建新列

HSQLDB 2.2 跳过某些实体而不为它们创建表

如何删除一列并创建一个新列而不是在 EF Core 中重命名?

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

使用包含嵌套列表的现有列的 出现总和创建一个新列