Как написать для l oop, который разбивает данные на основе соответствующего значения столбца в R - PullRequest
1 голос
/ 01 мая 2020

Я борюсь с логическим обоснованием написания для l oop. Рассмотрим следующие два кадра данных:

>> df1
     A    B      C             hit_time  E
0  bar  one  small  2019-12-11 19:16:51  1 
1  bar  one  large  2019-12-09 20:21:43  2 
2  foo  two  large  2019-12-11 15:11:24  1 
3  bar  two  small  2019-12-05 16:41:21  2 
4  bar  two  small  2019-12-06 17:31:20  3 
5  bar  one  large  2019-12-03 19:13:06  2 
6  bar  one  small  2019-12-04 18:25:04  1 
7  bar  two  small  2019-12-02 21:45:38  1 
8  bar  two  large  2019-12-08 20:32:44  1 

>> df2
     X    Y      Z            Phase_One            Phase_Two          Phase_Three
0  foo  one  small  2019-12-01 06:18:00  2019-12-01 06:38:00  2019-12-01 06:48:00
1  bar  one  small  2019-12-01 06:33:00  2019-12-01 06:53:00  2019-12-01 07:03:00  
2  foo  two  large  2019-12-11 15:01:24  2019-12-11 15:21:24  2019-12-11 15:31:24
3  bar  two  small  2019-12-05 16:31:21  2019-12-05 16:51:21  2019-12-05 17:01:21  
4  bar  two  small  2019-12-06 17:21:20  2019-12-06 17:41:20  2019-12-06 17:51:20 
5  bar  one  large  2019-12-03 19:03:06  2019-12-03 19:23:06  2019-12-03 19:33:06
6  bar  one  large  2019-12-04 18:15:04  2019-12-04 18:35:04  2019-12-04 18:45:04 
7  bar  two  large  2019-12-02 21:35:38  2019-12-02 21:55:38  2019-12-02 22:05:38 
8  bar  two  large  2019-12-08 20:22:44  2019-12-08 20:42:44  2019-12-08 20:52:44

Теперь я пытаюсь выполнить sh следующее в for l oop:

  1. Разделить df1 на столбец C значения
  2. Разделить df2 на те же значения в столбце Z
  3. Рассчитать следующее:
df3 <- df2[, Phase_One_   := df1[df2,on=.(hit_time >= Phase_One,  hit_time <= Start_Time), sum(E),by=.EACHI]$V1]
df3 <- df2[, Phase_Two_   := df1[df2,on=.(hit_time >= Start_Time, hit_time <= Phase_Two),  sum(E),by=.EACHI]$V1]
df3 <- df2[, Phase_Three_ := df1[df2,on=.(hit_time >= Phase_Two,  hit_time <= Phase_Three),sum(E),by=.EACHI]$V1]
rbind всех данных так, чтобы сумма произошла на основе соответствующих значений в df1$C и df2$Z соответственно.

Теперь я понимаю, что циклы for работают медленно, поэтому любые предложения позволяют суммировать столбец E в новый фрейм данных в новых столбцах на основе последних трех столбцов, содержащих разные сроки в дф2. Заранее спасибо.

1 Ответ

0 голосов
/ 01 мая 2020

Я написал функцию, которая делает это для другого проекта. (разделив кадры данных, вы можете рассчитать, что вы хотите, после этой ссылки на правильную таблицу в списке вывода)

multifilter <- function(data,filterorder){  
  #error if filter(s) do not exsist
  if(any(is.na(match(filterorder,names(data))))==T){stop("Atleast one filter does not exsist")}
  newdata <- list(data)
  for(i in rev(filterorder)){
    newdata <- unlist(lapply(sort(unique(data[,i])), function(x) lapply(newdata, function(y) y[y[,i]==x,])),recursive=F)
  }
  return(newdata[sapply(newdata,nrow)>=1])
}

вы можете назвать это так multifilter(df1,"C"). Сама функция более сложна, чем ваша задача, потому что она может принимать более одного фильтра, например multifilter(df2,"c("Y","Z")). Если вы когда-нибудь захотите соединить выходные данные из мульти фильтра, вы можете использовать do.call(rbind, multi_filter_data)

...