使用 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中使用某些列名的字符向量选择列?[重复]