如何将r data.table表达式转换为循环函数

时间:2019-06-18 19:26:53

标签: r data.table

我正在尝试将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

1 个答案:

答案 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相同。