rollapplyr () создает только один новый столбец вместо нескольких столбцов для каждого столбца в .SDcols - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь использовать 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')]

Этот код генерирует таблицу данных из двух столбцов (cyl и V1) из 64 строк, а не таблицу данных из трех столбцов (cyl, V1 и V2 ) из 32 столбцов. Есть ли способ получить последнее?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2020

Используйте lapply до l oop для выбранных столбцов в .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
#....
2 голосов
/ 03 февраля 2020

Вы можете попробовать:

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
1 голос
/ 03 февраля 2020

Проблема в том, что rollapplyr создает матрицу, тогда как data.table ожидает список, data.frame или data.table. Просто конвертируй и все будет в порядке. Также вам не нужно align = "right", если вы используете rollapplyr с r на конце.

cars[, as.data.table(rollapplyr(.SD, mean, width = 3, partial = TRUE)), 
     by = cyl, 
     .SDcols = c('mpg', 'hp')]
...