首页 > 解决方案 > 如何将 data.table 完全与变量一起使用?

问题描述

我对将变量作为输入的 data.table 语法有疑问。举个例子,我使用了 data.table 介绍(https://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.html)使用的标准数据集。

input <- if (file.exists("flights14.csv")) {
   "flights14.csv"
} else {
  "https://raw.githubusercontent.com/Rdatatable/data.table/master/vignettes/flights14.csv"
}
flights <- fread(input)

变量作为输入的使用非常简短,但没有达到我需要的程度。如何从 data.table 介绍中获取(稍作修改)示例

ans <- flights[carrier == "AA" & month == 6L,
        .(mean(arr_delay), mean(dep_delay)),
        by = .(origin, dest, month)]
ans

完全带有任意变量,例如

var1 = c("carrier", "month")
var2 = c("AA",6L)
var3 = c(mean,mean)
var4 = c("arr_delay", "dep_delay")
var5 = c("origin","dest","month")

?

我想获得与 with 相同的输出,ans但结果应仅取决于var1tovar5by, .()or之类的运算符==。我一直在尝试使用..variwith=F什至的各种组合,get(vari)但没有得到我想要的结果。

标签: rdata.table

解决方案


这是一种方法:

library(data.table)
#filter the rows based where var1 and var2 is true
tmp <- flights[rowSums(sweep(flights[, ..var1], 2, var2, `==`)) == length(var1)]
#apply var3 functions on var4 columns group by var5 columns
ans1 <- tmp[, Map(function(x, y) x(y), var3, .SD), .SDcols = var4, by = var5]
#Check the answer
identical(ans, ans1)
#[1] TRUE

推荐阅读