【问题标题】:Rename grouping variable in data.table [duplicate]重命名data.table中的分组变量[重复]
【发布时间】:2020-08-19 11:20:21
【问题描述】:

我想对data.table 进行分组,但在最终输出中为分组变量使用不同的名称。

数据

library(data.table)
set.seed(1)
d <- data.table(grp = sample(4, 100, TRUE))

选项

我可以像这样使用链接:

d[, .(Frequency = .N), keyby = grp][
  , .("My Fancy Group Name" = grp, Frequency)]
#    My Fancy Group Name Frequency
# 1:                   1        27
# 2:                   2        31
# 3:                   3        22
# 4:                   4        20

或重命名之前的列:

d[, c("My Fancy Group Name" = list(grp), .SD)][
  , .(Frequency = .N), keyby = "My Fancy Group Name"]
#    My Fancy Group Name Frequency
# 1:                   1        27
# 2:                   2        31
# 3:                   3        22
# 4:                   4        20

或者为分组变量定义一个别名,然后删除分组变量:

d[, .("My Fancy Group Name" = grp, Frequency = .N), keyby = grp][
  , grp := NULL][]
#    My Fancy Group Name Frequency
# 1:                   1        27
# 2:                   2        31
# 3:                   3        22
# 4:                   4        20

但所有形式都使用链。

我可以避免the not recommended approach from here 的链接(这不仅是一种黑客行为,而且效率非常低):

d[, .("My Fancy Group Name" = .SD[, .N, keyby = grp]$grp,
      Frequency = .SD[, .N, keyby = grp]$N)]
#    My Fancy Group Name Frequency
# 1:                   1        27
# 2:                   2        31
# 3:                   3        22
# 4:                   4        20

问题

从概念上讲,我想使用这样的东西

# d[, .(Frequency = .N), keyby = c("My Fancy Group Name" = grp)]
  1. 是否可以不使用我展示的 hack 来实现解决方案链免费?
  2. 如果我们有一个巨大的data.table,哪个选项在内存/时间方面表现“最佳”?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您实际上可以执行与您的尝试类似的操作,但使用 list 而不是 c

    library(data.table)
    d[, .(Frequency = .N), keyby = list(`My Fancy Group Name` = grp)]
    #Also works with quotes
    #d[, .(Frequency = .N), keyby = list("My Fancy Group Name" = grp)]
    
    #   My Fancy Group Name Frequency
    #1:                   1        27
    #2:                   2        31
    #3:                   3        22
    #4:                   4        20
    

    短版:

    d[, .(Frequency = .N), .("My Fancy Group Name" = grp)]
    

    【讨论】:

    • 等等瞧。当解决方案如此接近但又如此遥远时。 +1
    【解决方案2】:

    使用setnames()也应该是高效的:

    setnames(d[, .N, keyby = grp], c("My Fancy Group Name", "Frequency"))
    

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 2018-08-07
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 2015-05-08
      • 2012-09-18
      • 1970-01-01
      • 2021-10-22
      相关资源
      最近更新 更多