使用 data.table 时如何从字符向量创建列名

Posted

技术标签:

【中文标题】使用 data.table 时如何从字符向量创建列名【英文标题】:How to create column names form character vector when using data.table 【发布时间】:2020-05-04 07:14:26 【问题描述】:

我有一个这样的 data.table:

dt = data.table(id_1 = c(rep(1:3, 5)), id_2 = sort(rep(c('A', 'B', 'C'), 5)), value_1 = rnorm(15, 1, 1), value_2 = rpois(15, 1))

我想创建一个函数,它按函数参数指定的一些列对表进行分组,并对另一个参数指定的其他几个列执行操作(比如说求和)。最后,我想将新列的名称指定为另一个函数参数。我的问题是:当我不使用引用分配 := 时,我真的不知道如何从字符向量创建名称。

以下两种方法完全实现了我想要做的,我只是不喜欢这种方式:

方法一:通过引用使用分配,然后每组只选择一条记录(并忘记原始列)

dt_aggregator_1 <- function(data,
                          group_cols = c('id_1', 'id_2'),
                          new_names = c('sum_value_1', 'sum_value_2'),
                          value_cols = c('value_1', 'value_2'))
  data_out = data
  data_out[,(new_names) := lapply(.SD, function(x)sum(x)),by = group_cols, .SDcols = value_cols]
  data_out[,lapply(.SD, max), by = group_cols, .SDcols = new_names]

方法2:分组后重命名列。我认为这是更好的方法。

dt_aggregator_2 <- function(data,
                            group_cols = c('id_1', 'id_2'),
                            new_names = c('sum_value_1', 'sum_value_2'),
                            value_cols = c('value_1', 'value_2'))
  data_out = data[,lapply(.SD, function(x)sum(x)),by = group_cols, .SDcols = value_cols]
  setnames(data_out, value_cols, new_names)
  data_out[]

我的问题是,如果在方法 2 中我可以在执行分组操作时以某种方式设置名称?所以我会把它减少到一行代码而不是 2:)

【问题讨论】:

其实,我开始有点喜欢第二种方法了,但还是想知道如何在一行中做到这一点:) 【参考方案1】:

您可以在同一行中包含setNames 并使其成为单行。

dt_aggregator_2 <- function(data,
                            group_cols = c('id_1', 'id_2'),
                            new_names = c('sum_value_1', 'sum_value_2'),
                            value_cols = c('value_1', 'value_2'))

  dt[,setNames(lapply(.SD, sum), new_names),by = group_cols, .SDcols = value_cols]


【讨论】:

没有setNames就没有办法了吗? 我想不出任何其他方法来总结价值。如果你想添加新列,你可以这样做dt[, (new_names) := lapply(.SD, sum),by = group_cols, .SDcols = value_cols] 是的。当我不想添加列时,我正在寻找它的等价物【参考方案2】:

你可以试试 dplyr 库

library(dplyr)

dt1 <- dt %>% group_by(id_1,id_2) %>%
  summarise(
    sum_value_1 = sum(value_1),
    sum_value_2 = sum(value_2)
  )

dt1

【讨论】:

您好,谢谢您的回答。然而,这不是我要找的。我希望函数具有通用性,并且我希望它基于数据表

以上是关于使用 data.table 时如何从字符向量创建列名的主要内容,如果未能解决你的问题,请参考以下文章

如何在data.table中使用某些列名的字符向量选择列?[重复]

R data.table:如何使用字符串中的名称创建新列?

将向量作为单独的新列附加到 data.table,向量回收单个值

使用R中的日期向量过滤data.table [关闭]

在data.table中逐行应用函数;将列名称作为向量传递

我可以强制 R data.table %like% 使用“fixed = TRUE”吗?