gpt4 book ai didi

r - 将字符串作为代码传递以使用 data.table 汇总多列

转载 作者:行者123 更新时间:2023-12-04 11:33:20 26 4
gpt4 key购买 nike

我们想总结一个数据表来创建很多新的变量,这些变量是由原始数据的列名和值组合而成的。这是一个可重现的示例,说明了我们希望通过两列实现的结果,只是为了简洁起见

library(data.table)
data('mtcars')
setDT(mtcars)

# Desired output
mtcars[, .(
acm_hp_carb2 = mean(hp[which( carb <= 2)], na.rm=T),
acm_wt_am1 = mean(wt[which( am== 1)], na.rm=T)
), by= .(cyl, gear)]

因为我们想要汇总很多列,所以我们创建了一个函数来返回我们将用于创建每个汇总变量的所有字符串。在这个例子中,我们有这个:

a <- 'acm_hp_carb2 = mean(hp[which( carb <= 2)], na.rm=T)'
b <- 'acm_wt_am1 = mean(wt[which( am== 1)], na.rm=T)'

这是我们失败的尝试。请注意,创建的新列不会收到我们要分配给它们的名称。

mtcars[, .(  
eval(parse(text=a)),
eval(parse(text=b))

), by= .(cyl, gear)]

最佳答案

似乎唯一不起作用的部分是列名。如果将 ab 放入向量中并为它们添加名称,则可以使用 lapply 执行 eval(parse 并保留向量中的名称。我使用正则表达式来获取名称,但大概在实际代码中,您可以将名称分配为您首先用来构造字符串的任何变量。

结果有很多 NaN,但它符合您想要的输出。

to_make <- c(a, b)
to_make <- setNames(to_make, sub('^(.*) =.*', '\\1', to_make))

mtcars2[, lapply(to_make, function(x) eval(parse(text = x)))
, by= .(cyl, gear)]

# cyl gear acm_hp_carb2 acm_wt_am1
# 1: 6 4 NaN 2.747500
# 2: 4 4 76.0 2.114167
# 3: 6 3 107.5 NaN
# 4: 8 3 162.5 NaN
# 5: 4 3 97.0 NaN
# 6: 4 5 102.0 1.826500
# 7: 8 5 NaN 3.370000
# 8: 6 5 NaN 2.770000

关于r - 将字符串作为代码传递以使用 data.table 汇总多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57633073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com