2016-06-21 8 views
0

У меня есть большой набор данных размером около 25 литров, где применяется эта функция «статус». Это мешающая процедура. Внутри fn выполняются операции векторизации и применения. c1-c4 - это столбцы в моих данных. Тем не менее для выполнения fn требуется около 5-6 часов.Как я могу разделить кадр данных и запустить на нем произвольные fuctions?

status(mydata) 
status <- function (x) { 

x<- subset(x, x$RECORD_TYPE != "INPUT") 
x$c1<- as.character(x$c1) 
x$c2 <- as.factor(x$c2) 
x$c3 <- as.factor(x$c3) 
return (data.frame(cbind( 
     tapply(x$c2, x$c4, 
      function (x) ifelse (!(any(x=="BAD")), "G", sum(x== "BAD"))) , 
     tapply(x$c2D, x$c4, 
      function (x) sum (x== "NEG")) ))) 
       } 

Есть ли способ ускорить fn. Я работаю на сервере с 16 ядрами. Поэтому я считаю, что это может быть еще больше ускорено.

+0

Просьба представить небольшой воспроизводимый пример для других тестировать – akrun

ответ

0

Возможно data.table подход будет быстрее, чем пытаться распараллелить ваш код, но я должен был бы образец данных, чтобы убедиться, что этот ответ адреса ваш вопрос:

library(data.table) 

setDT(mydata) 

mydata[ RECORD_TYPE != "INPUT", 
        .(var1 = ifelse (!(any(c2=="BAD")), "G", sum(c2== "BAD")), 
        var2 = sum (c2D== "NEG")), by= c4]