我正在尝试将R data.table代码片段转换为适当的函数,但是没有成功。
我想使用以下代码总结一个变量:
library(data.table)
mtcars_dt <-
data.table(mtcars)
# Expression
mtcars_dt[,list(.N),by=cyl][order(cyl),list(cyl,N,Proportion=N/sum(N))]
结果是一个data.table(按预期):
cyl N Proportion
1: 4 11 0.34375
2: 6 7 0.21875
3: 8 14 0.43750
然后,我希望创建一个函数并将此函数应用于多个变量,并通过应用该函数的循环的每次迭代生成一个data.table:
# turn into function and apply loop, returning DT from each iteration
var_list <- c('cyl','gear')
for (i in var_list){
# generalize the code above
}
我不确定最好的处理方法。我尝试了此解决方案,但在第一列中丢失了变量名。我想知道我是否使用eval(quote(...))
走错了轨道# My attempt, not working yet!
var_list <- c(quote(cyl),quote(gear))
f_numeric_cat <-
function(dt,var1) {
dt[,list(.N),by=eval(var1)][order(eval(var1)),Proportion:=N/sum(N)][]
}
for (i in var_list){
print(f_numeric_cat(mtcars_dt,i))
}
var1 N Proportion
1: 6 7 0.21875
2: 4 11 0.34375
3: 8 14 0.43750
var1 N Proportion
1: 4 12 0.37500
2: 3 15 0.46875
3: 5 5 0.15625
答案 0 :(得分:2)
目标是DT和var要做的功能:
dic = {'Daily Time on Site': [59.99, 88.91, 66.00, 74.53, 69.88, 47.64, 83.07, 69.57], 'Age': [23,33,48,30,20,49,37,48], 'Gender': [1, 0, 1, 1, 1, 0, 1, 1], 'Clicked': [0, 0, 1, 0, 0, 1, 0, 1]} my_data = pd.DataFrame(dic) variables = my_data[['Clicked']] #values are only 0 and 1 (0 = not clicked , 1 = clicked) results = my_data[['Daily Time on Site', 'Age', 'Gender']] #values are integers and floats multi_output_clf = MultiOutputClassifier(LogisticRegression(solver='lbfgs', multi_class='ovr')) multi_output_clf.fit(variables.values.reshape(-1, 1),results) x = multi_output_clf.predict([1]) print(x)
要按变量进行计算然后按其排序,请使用DT[, list(.N), by=var][order(var), list(var, N, Proportion=N/sum(N))]
。这样您的功能可以变成:
keyby=
f_tabulate <-
function(DT, var) {
DT[, list(.N), keyby=var][, Proportion := N/sum(N)][]
}
# usage
for (i in c('cyl', 'gear')) print(f_tabulate(mtcars_dt, i))
和keyby=
可以采用多种形式的参数,并且您无需引用或评估简单的变量名向量。 (其他方式包括by=
,.(var1, var2)
,list(var1, var2)
。)您还可以扩展到通过多个变量进行计数...
"var1,var2"
对于此操作(订购部分除外),还可以使用f_tabulate2 <-
function(DT, ...) {
DT[, list(.N), keyby=c(...)][, Proportion := N/sum(N)][]
}
# usage
f_tabulate2(mtcars_dt, 'cyl', 'gear')
:
groupingsets()
作为一项功能(并重新添加订购)...
> groupingsets(mtcars_dt, .N, keyby=c('cyl', 'gear'), sets=list("cyl", "gear"))[,
Proportion := N/nrow(mtcars_dt)][]
cyl gear N Proportion
1: 6 NA 7 0.21875
2: 4 NA 11 0.34375
3: 8 NA 14 0.43750
4: NA 4 12 0.37500
5: NA 3 15 0.46875
6: NA 5 5 0.15625
在将f_tabulate_all = function(DT, vars){
lvars = as.list(vars)
ocall = as.call(lapply(c("order", vars), as.name))
groupingsets(DT[eval(ocall)], .N, by=vars, sets=as.list(vars))[,
Proportion := N/nrow(DT)][]
}
# usage
f_tabulate_all(mtcars_dt, c('cyl', 'gear'))
函数应用于命名函数或其他对象的字符串时,其功能与as.name
相同。