2015-12-29 8 views
0

Ниже приведен простой цикл:оптимизация R Код со списком

TSDF имеет тип «POSIXct» «POSIXt» и содержит список временных меток. LISTY - это список с отметками времени и их значениями. Используя цикл FOR FOR, мне нужно пройти всю длину TSDF и в зависимости от того, какая временная метка из TSDF также доступна в DF, мне нужно присвоить ее значение newval. Код ниже работает отлично, но требуется много времени, если TSDF слишком длинный. Любые предложения по оптимизации этого кода? Заранее спасибо. Цените.

for(i in 1:length(TSDF)) 
{ 
    if(any(TSDF[[i]]==LISTY[[1]][,"DATETIMEST"])) 
    { 
    newval = LISTY[[1]][which(TSDF[[i]]==LISTY[[1]][,"DATETIMEST"]),"VALUE"] 
    } 
    else{newval = oldval} 

    if(any(TSDF[[i]]==LISTY[[2]][,"DATETIMEST"])) 
    { 
    newval = LISTY[[2]][which(TSDF[[i]]==LISTY[[2]][,"DATETIMEST"]),"VALUE"] 
    } 
    else{newval = oldval} 
} 
+0

Пожалуйста, укажите примеры наборов данных «TSDF» и «LISTY». –

+0

этот вопрос, возможно, более уместен на codereviews –

+0

TSDF <- as.POSIXct (c ("2015-12-19 23:40:04", "2015-12-20 00:00:02", "2015-12- 20 00:00:13 "," 2015-12-20 00:00:17 "," 2015-12-20 00:00:22 "," 2015-12-20 00:00:27 ")) –

ответ

0

Если я правильно вас понимаю, следующий код будет делать то, что вы хотите. К сожалению, ваши данные примера не содержали никаких значений. Следовательно, я должен был угадать. Я также преобразовал ваш список/вектор в кадры данных для использования слияния.

#generate some dummy data 
LISTY <- as.data.frame(list(x=as.POSIXct(c("2015-12-19 23:40:04", 
              "2015-12-20 00:00:02", 
              "2015-12-20 00:00:13")), 
          y=as.POSIXct(c("2015-12-20 00:00:17", 
              "2015-12-20 00:00:22", 
              "2015-12-20 00:00:27")), 
          val=c("a","b","c"))) 

tsdf.key <- as.POSIXct(c("2015-12-19 23:40:04", 
      "2015-12-20 00:00:02", 
      "2015-12-20 00:00:13", 
      "2015-12-20 00:00:17", 
      "2015-12-20 00:00:22", 
      "2015-12-20 00:00:27", 
      "2015-12-20 00:00:28")) 
tsdf.val <- 1:length(tsdf.key) 
TSDF <- data.frame(tsdf.key,tsdf.val) 
names(TSDF) <- c("key","value") 
names(LISTY)<-c("DATETIMEST","RECORDEDTIMESTAMP","value") 

# join data on left outer join 
merge1<- merge(x=TSDF,y=LISTY,by.x="key",by.y="DATETIMEST",all.x=TRUE) 
merge2<- merge(x=merge1,y=LISTY,by.x="key",by.y="RECORDEDTIMESTAMP",all.x=TRUE) 

###replace this by value 
#populate 
names(newval) <- c("newval") 
#fill in datetimestamp 
selector <- which(!is.na(merge2["value.y"])) 
newval <- merge2["value.x"] 
newval[selector] 
#fill in recordedtimespamp 
selector <- which(!is.na(merge2["value.y"])) 
newval <- merge2["value.x"]