Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在data.table group by子句中使用变量_R_List_Data.table - Fatal编程技术网

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

在data.table group by子句中使用变量,r,list,data.table,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)] 库(data.table) dtIris您可以使用eval(pars

我有一个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)]
库(data.table)
dtIris您可以使用
eval(parse(text=myvar))
get(myvar)
但这将分别命名分组列
parse
get
(然后您可以重命名它)


get
eval(parse(text=…)
快,后者比使用
by
的字符形式,然后删除它(链接dts)来定义
trimposes
要快。

by
语句不接受字符串。它确实接受变量引用

因此,您可以创建一个变量来复制要通过以下方式聚合的列的数据,而不是引用列名:

myvar <- dtIris[,Petal.Length]
dt2 <- dtIris[, list(AvgSepalWidth = mean(Sepal.Width)), 
          by=list(TrimSpecies = substr(Species,1,3),myvar)]
all(dt2==dt1)
#TRUE

myvar当我想同时按多个变量分组时,事情变得有点棘手。继续操作的方法是创建一个变量
myvar
,该变量包含进行分组所依据的列的名称(本例中为2);然后可以按以下方式使用
get
两次:

dtIris[, list(AvgSepalWidth = mean(Sepal.Width)), by = list(get(myvar[1]), get(myvar[2]))]

dtIris[,list(AvgSepalWidth=mean(Sepal.Width)),by=setNames(list(substr(Species,1,3),get(myvar)),c(“trimpspecies”,myvar))]
这是我最喜欢的在名字没有通过时整理东西的函数。出于兴趣,我只是做了那个,哈,是的,我删除了那个答案,这看起来太可笑了,对于任意数量的列,mget()函数创建列表并为其命名,例如,
byfields
by
可以接受字符串,例如
dtIris[,list(AvgSepalWidth=mean(Sepal.Width)),by=“Petal.Length”]
。您的解决方案是可行的,但无法解决名称问题,更不用说它会对整个列进行不必要的复制。
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
myvar <- dtIris[,Petal.Length]
dt2 <- dtIris[, list(AvgSepalWidth = mean(Sepal.Width)), 
          by=list(TrimSpecies = substr(Species,1,3),myvar)]
all(dt2==dt1)
#TRUE
dtIris[, list(AvgSepalWidth = mean(Sepal.Width)), by = list(get(myvar[1]), get(myvar[2]))]