R 数据表动态列名组通过返回新表



默认情况下,对 data.table 的组 by 操作返回一个新的 data.tableV1列:

dt <- data.table(a = sample(1:100, 100), b = sample(1:100, 100), id = rep(1:10,10))
dt[, mean(a), by = id]
#     id V1
# 1:  1 48.2
# 2:  2 47.9
# 3:  3 46.8
# 4:  4 54.7
# 5:  5 63.7
# 6:  6 50.6
# 7:  7 43.3
# 8:  8 52.7
# 9:  9 45.4
# 10: 10 51.7

在这篇文章之后,我可以用这样的结果设置列的名称

dt[, list(mean = mean(a)), by = id]

是否可以为列名设置变量? 例如,与其明确设置mean,不如做类似的事情

column_name <- "mean"
dt[, list(column_name = mean(a)), by = id]  # resulting column name is column_name (and not mean)

我们可以使用setNames

library(data.table)
dt[, setNames(list(mean(a)), column_name), by = id]
#    id mean
# 1:  1 56.8
# 2:  2 50.5
# 3:  3 50.5
# 4:  4 42.4
# 5:  5 49.9
# 6:  6 47.8
# 7:  7 60.6
# 8:  8 57.4
# 9:  9 54.6
#10: 10 34.5

数据

set.seed(123)
dt <- data.table(a = sample(1:100, 100), b = sample(1:100, 100), id = rep(1:10,10))
column_name <- "mean"

我们可以使用data.table中的setnames

library(data.table)
setnames(dt[, .(mean(a)), by = id], 'V1', column_name)[]
#    id mean
# 1:  1 56.8
# 2:  2 50.5
# 3:  3 50.5
# 4:  4 42.4
# 5:  5 49.9
# 6:  6 47.8
# 7:  7 60.6
# 8:  8 57.4
# 9:  9 54.6
#10: 10 34.5

数据

set.seed(123)
dt <- data.table(a = sample(1:100, 100), b = sample(1:100, 100), id = rep(1:10,10))
column_name <- "mean"

为了完整起见,您还可以部署一个返回命名列表的循环。例如,使用Map()

dt[
, Map(
function(i) {
mean(a)
}
, i = "Mean"
)
, by = id
]

或者对于 2+ 函数调用/列:

dt[
, Map(
function(i, fun) {
do.call(
fun
, list(a)
)
}
, i = c("Mean", "SD")
, fun = c(mean, sd)
)
, by = id
]
#     id Mean       SD
#  1:  1 56.8 29.23012
#  2:  2 50.5 26.18842
#  3:  3 50.5 24.82047
#  4:  4 42.4 34.72495
#  5:  5 49.9 26.99979
#  6:  6 47.8 28.35411
#  7:  7 60.6 31.52142
#  8:  8 57.4 32.22904
#  9:  9 54.6 27.90141
# 10: 10 34.5 30.94529

最新更新