【问题标题】:How to create column names form character vector when using data.table使用 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:)

【问题讨论】:

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

标签: r data.table


【解决方案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

【讨论】:

  • 您好,谢谢您的回答。然而,这不是我要找的。我希望函数具有通用性,并且我希望它基于数据表
猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 2015-11-17
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多