gpt4 book ai didi

r - 在 data.table group by 子句中使用变量

转载 作者:行者123 更新时间:2023-12-03 15:58:59 25 4
gpt4 key购买 nike

我有一个数据表,我想总结一下。这是我的方法

library(data.table)

dtIris <-data.table(iris)
dt1 <- dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3),Petal.Length)]

我希望能够使用变量来识别要分组的项目之一,但我无法让它评估列表中的变量。它只是把它当作一个字符串并抛出一个错误。
myvar <- "Petal.Length"
dt1 <- dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3),myvar)]

我试过 noquote() , eval() , parse(text=)一切都无济于事。任何指导将不胜感激。

最佳答案

您可以使用 eval(parse(text=myvar))get(myvar)虽然这将命名您的分组列 parseget分别(然后你可以重命名它)。

myvar <- "Petal.Length"
dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3), eval(parse(text=myvar)))]

dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3), get(myvar))]

我不知道如何以一种像你想要的那样保留名称的方式来做到这一点。 (编辑: by=setNames(list(...), c('TrimSpecies', myvar)) - 谢谢@thelatemail!)

编辑 - 出于兴趣,回应下面的一些评论。
library(rbenchmark)
benchmark(
eval=dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3), eval(parse(text=myvar)))],
get=dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3), get(myvar))],
chain=dtIris[, TrimSpecies := substr(Species,1,3)][,list(AvgSepalWidth = mean(Sepal.Width)),by=c("TrimSpecies",myvar)][,TrimSpecies:=NULL][]
)
test replications elapsed relative user.self sys.self user.child sys.child
3 chain 100 0.151 1.987 0.250 0 0 0
1 eval 100 0.079 1.039 0.097 0 0 0
2 get 100 0.076 1.000 0.094 0 0 0
geteval(parse(text=..))) 快这比定义 TrimSpecies 快, 使用字符形式 by然后将其删除(链接 dts)。

关于r - 在 data.table group by 子句中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600666/

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