R 将多个列名传递给";由「;在data.table函数中
我读过很多关于将列名传递给data.table函数的文章,但我没有看到一篇关于将多个变量传递给“by”的文章。我通常使用这样的代码按组计算汇总统计数据R 将多个列名传递给";由「;在data.table函数中,r,function,data.table,R,Function,Data.table,我读过很多关于将列名传递给data.table函数的文章,但我没有看到一篇关于将多个变量传递给“by”的文章。我通常使用这样的代码按组计算汇总统计数据 # Data library(data.table) dt=mtcars setDT(dt) # Summary Stats Example dt[cyl==4,.(Count=.N, Mean=mean(hp), Median=median(hp)), by=.(am,vs)] # am vs Count
# Data
library(data.table)
dt=mtcars
setDT(dt)
# Summary Stats Example
dt[cyl==4,.(Count=.N,
Mean=mean(hp),
Median=median(hp)),
by=.(am,vs)]
# am vs Count Mean Median
# 1: 1 1 7 80.571 66
# 2: 0 1 3 84.667 95
# 3: 1 0 1 91.000 91
我无法使以下函数正常工作:
# Function
myFun <- function(df,i,j,by){
df[i==4,.(Count=.N,
Mean=mean(j),
Median=median(j)),
by=.(am,by)]
}
myFun(dt,i='cyl',j='hp',by='vs')
#函数
myFun只需通过数据的一部分为创建一个字符向量。表
,它将起作用:
myFun <- function(df, i, j, by){
df[get(i) == 4, .(Count = .N,
Mean = mean(get(j)),
Median = median(get(j))),
by = c(by, 'am')]
}
myFun(dt, i = 'cyl', j = 'hp', by = 'vs')
#vs am Count Mean Median
#1: 1 1 7 80.57143 66
#2: 1 0 3 84.66667 95
#3: 0 1 1 91.00000 91
myFun我接受了sm95的答案。下面是一个更复杂的示例/解决方案,它通过
参数向发送列表:
# Libraries
library(data.table)
# Data
dt = mtcars
setDT(dt)
# Function to calculate summary statistics
myFun <- function(df, i1var, i1val, i2var, i2val, # i arguments
j, # j arguments
by1var, by2var, by2val){ # by arguments
df[get(i1var) == i1val & get(i2var) %in% i2val,
.(Count = .N,
Mean = mean(get(j)),
Median = median(get(j))),
by = .(get(by1var), get(by2var) == by2val)]
} # END Function
# Run function
myFun(dt,i1var = 'cyl', i1val = 4, i2var = 'gear', i2val = c(3,4),
j = 'hp',
by1var = 'vs', by2var = 'am', by2val = 1)
# vs am Count Mean Median
# 1: 1 1 6 75.16667 66
# 2: 1 0 3 84.66667 95
# Should match
dt[cyl == 4 & gear %in% c(3,4),
.(Count = .N,
Mean = mean(hp),
Median = median(hp)),
by = .(vs, am == 1)]
# vs am Count Mean Median
# 1: 1 1 6 75.16667 66
# 2: 1 0 3 84.66667 95
#库
库(数据表)
#资料
dt=mtcars
setDT(dt)
#用于计算汇总统计信息的函数
myFun无需查看或eval(by)
。谢谢@sm925和@sindri_baldur。我注意到上面的代码将by参数从列表更改为向量。我的示例没有显示它,但我通常在by参数中应用条件(例如grp>2
),因此出于一般目的,我需要使用by=。()
。您的回答帮助我起草了以下备忘单:-使用get(var)传递I、j和by变量
-直接通过i或通过标准以上假设通过的是一个列表。在更复杂的场景中,上述操作可能会失败或被视为不好的做法。例如,我使用merge()
而不是利用[
来连接两个data.table。