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

Dan*_*Dan 5 r list data.table

我有一个data.table,我想总结一下.这是我的方法

library(data.table)

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

我希望能够使用变量来识别要分组的项目之一,我只是无法让它来评估列表中的变量.它只是将它视为一个字符串并抛出错误.

myvar <- "Petal.Length"
dt1 <- dtIris[, list(AvgSepalWidth = mean(Sepal.Width)), 
              by=list(TrimSpecies = substr(Species,1,3),myvar)]
Run Code Online (Sandbox Code Playgroud)

我已经试过noquote(),eval(),parse(text=)都无济于事.任何指导都会非常感激.

mat*_*fee 7

您可以使用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))]
Run Code Online (Sandbox Code Playgroud)

我不知道如何以保留名称的方式来实现它.(编辑: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
Run Code Online (Sandbox Code Playgroud)

get快于eval(parse(text=..)))比限定快TrimSpecies,使用的字符形式by,然后除去它(链接DTS).

  • `dtIris[, list(AvgSepalWidth = mean(Sepal.Width)), by=setNames(list(substr(Species,1,3), get(myvar)),c("TrimSpecies",myvar))]` (4认同)