У меня есть набор данных с несколькими числовыми столбцами и более 100 миллионами строк в качестве объекта data.table.Я хотел бы сделать групповые операции над некоторыми из столбцов на основе других столбцов.Например, подсчитать уникальные элементы столбца «а» на каждую категорию в столбце «d».
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)
Как я могу улучшить это решение?Например, было бы здорово просто передать только необходимые столбцы каждой функции, а не весь фрейм данных.