我有一个数据集,其中包含很少的数字列和超过 1 亿行的 data.table 对象。我想根据其他列对某些列进行分组操作。例如,对“d”列中每个类别的“a”列的唯一元素进行计数。
my_data[, a_count := uniqueN(col_a), col_d]
我有许多彼此独立的操作,并行运行它们会很棒。我发现以下代码片段将并行运行不同的函数。
fun1 = function(x){
x[, a_count := uniqueN(col_a), col_d]
return(x[, .(callId, a_count)])
}
fun2 = function(x){
x[, b_count := uniqueN(col_b), col_d]
return(x[, .(callId, b_count)])
}
fun3 = function(x){
x[, c_count := uniqueN(col_c), col_d]
return(x[, .(callId, c_count)])
}
tasks = list(job1 = function(x) fun1(x),
job2 = function(x) fun2(x),
job3 = function(x) fun3(x))
cl = makeCluster(3)
clusterExport(cl, c('fun1', 'fun2', 'fun3', 'my_data', 'data.table', 'uniqueN'))
out = clusterApply(
cl,
tasks,
function(f) f(my_data)
)
stopCluster(cl)
我该如何改进这个解决方案?例如,如果只将必要的列传递给每个函数而不是整个数据框,那就太好了。