2017-01-30 3 views
0

1-ДФА:Как использовать применять функцию вместо для цикла, если у вас есть несколько, если условия будут теми или иными строчка

t.d 
    V1 V2 V3 V4 
1 1 6 11 16 
2 2 7 12 17 
3 3 8 13 18 
4 4 9 14 19 
5 5 10 15 20 


names(t.d) <- c("ID","A","B","C") 

t.d$FinalTime <- c("7/30/2009 08:18:35","9/30/2009 19:18:35","11/30/2009 21:18:35","13/30/2009 20:18:35","15/30/2009 04:18:35") 

t.d$InitTime <- c("6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35") 

>t.d 
    ID A B C   FinalTime   InitTime 
1 1 6 11 16 7/30/2009 08:18:35 6/30/2009 9:18:35 
2 2 7 12 17 9/30/2009 19:18:35 6/30/2009 9:18:35 
3 3 8 13 18 11/30/2009 21:18:35 6/30/2009 9:18:35 
4 4 9 14 19 13/30/2009 20:18:35 6/30/2009 9:18:35 
5 5 10 15 20 15/30/2009 04:18:35 6/30/2009 9:18:35 

второго DF:

> s.d 
    F D E    Time 
1 10 19 28 6/30/2009 08:18:35 
2 11 20 29 8/30/2009 19:18:35 
3 12 21 30 9/30/2009 21:18:35 
4 13 22 31 01/30/2009 20:18:35 
5 14 23 32 10/30/2009 04:18:35 
6 15 24 33 11/30/2009 04:18:35 
7 16 25 34 12/30/2009 04:18:35 
8 17 26 35 13/30/2009 04:18:35 
9 18 27 36 15/30/2009 04:18:35 

Выхода быть:

С DF «td» Мне нужно рассчитать временной интервал для каждой строки между «FinalTime» и «InitTime» (InitTime всегда будет меньше FinalTime).

Другая DF «temp» из «sd» должна быть сформирована с данными только в пределах указанного временного интервала, а затем должны быть приняты и присоединены самые последние значения «F», «D», «E» к «i-ой» строке «td», из которой был рассчитан временной интервал.

Кроме того, мы должны видеть, если новоиспеченная DF «Темп» имеет истинные следующие условия:

здесь «J» представляет собой значение для каждой строки:

if(temp$F[j] < 35.5) + (temp$D[j] >= 100) >= 1) 
{ 
    temp$Flag <- 1 
} else{ 
    temp$Flag <- 0 
} 

Первоначально у меня есть 3 миллиона строк в кадре данных и 20 столбцах в каждом DF.

Я решил проблему выше, используя «для цикла», но это, очевидно, занимает от 2 до 3 дней, так как есть много строк.

(Кроме того, если я должен добавить новые столбцы в результирующей DF, если несколько условий получить выполняется на каждой строке?)

Кто-нибудь может предложить другой метод? Как использовать функции приложения?

+0

Я не знаю точно, но общая функция из пакета dplyr, кажется, что вы ищете. – Llopis

+0

Прежде всего, ваши столбцы datetime должны иметь соответствующий тип. Поместите эти столбцы в 'POSIXct'. Затем рассмотрим функцию 'foverlaps'' data.table'. – nicola

ответ

0

Мое предложение:

  • использование lapply по индексам строк
  • ручку в функции называют ваши, если ветви
  • возвращение либо ваш dataframe или NULL
  • объединить все с rbind
  • заменяя lapply на mclapply из пакета «parallel», ваш код запускается параллельно.

    resultList <- lapply(1:nrow(t.d), function(i){ 
    do stuff 
    if(condition){ 
        return(df) 
    }else{ 
        return(NULL) 
    } 
    resultDF <- do.call(rbind, resultList) 
    

 Смежные вопросы

  • Нет связанных вопросов^_^