【问题标题】:rollapplyr() creates only one new column instead of multiple columns for each column in .SDcolsrollapplyr() 只为 .SDcols 中的每一列创建一个新列而不是多个列
【发布时间】:2020-02-03 09:14:11
【问题描述】:

我正在尝试在数据表上使用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)的数据表。有没有办法获得后者?

【问题讨论】:

    标签: r data.table rollapply


    【解决方案1】:

    你可以试试:

    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
    

    【讨论】:

      【解决方案2】:

      使用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
      #....
      

      【讨论】:

        【解决方案3】:

        问题在于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')]
        

        【讨论】:

          猜你喜欢
          • 2012-04-17
          • 1970-01-01
          • 2020-01-15
          • 2020-10-22
          • 2021-11-15
          • 1970-01-01
          • 2019-04-27
          • 2012-03-21
          相关资源
          最近更新 更多