【问题标题】:grouping table by multiple factors and spreading it from long format to wide - the data.table way in R按多个因素对表格进行分组并将其从长格式扩展到宽格式 - R 中的 data.table 方式
【发布时间】:2020-07-01 11:38:25
【问题描述】:

例如,我将使用 R 中可用的 mtcars 数据:

data(mtcars)
setDT(mtcars)

让我想按三个变量对数据进行分组,即:carbcylgear。我已经这样做了。但是,我相信有更好的方法,因为这是相当重复的。

newDTcars <- mtcars [, mtcars[, mtcars[, .N , by = carb], by = cyl], by= gear]

其次,我想要宽格式的数据,其中每个gear 级别都有一个单独的列。出于说明目的,我使用tidyr 完成了此操作,但是我希望以“data.table”的方式完成此操作。

newDTcars %>% tidyr::spread(gear, N)

这个问题的重点是继续解决 data.table 世界,因为我也想了解更多关于 data.table 的信息。

【问题讨论】:

  • 也许dat[, .N, by=c("var1", "var2", "var3")] 是您的第一步。然后使用dcast 重塑宽。
  • 你需要dcast(mtcars[, .N, .(carb, cyl, gear)], carb+cyl~gear, value.var = "N") 吗?
  • @RonakShah 完全正确。你能把它写成答案让我接受吗?

标签: r data.table tidyr


【解决方案1】:

data.table 中,我们可以按多列分组,并且可以使用dcast 进行整形。

library(data.table)
dcast(mtcars[, .N, .(carb, cyl, gear)], carb+cyl~gear, value.var = "N")

#   carb cyl  3  4  5
#1:    1   4  1  4 NA
#2:    1   6  2 NA NA
#3:    2   4 NA  4  2
#4:    2   8  4 NA NA
#5:    3   8  3 NA NA
#6:    4   6 NA  4 NA
#7:    4   8  5 NA  1
#8:    6   6 NA NA  1
#9:    8   8 NA NA  1

您可以在dcast 中使用fill 参数将NAs 替换为0 或任何其他数字。

【讨论】:

  • 答案是绝对正确的。我只是想说,您可以将dcast 作为链接 data.table 表达式的 j 部分的参数传递:mtcars[, .N, by = .(carb, cyl, gear)][, dcast(.SD, carb+cyl ~ gear, value.var = "N")]。它将在没有明显性能损失的情况下运行。
猜你喜欢
  • 2017-02-13
  • 2021-12-24
  • 1970-01-01
  • 2021-09-18
  • 2021-09-06
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多