R объединить data.frames asof join - PullRequest
3 голосов
/ 05 июля 2011

У меня есть целая куча фреймов данных с нерегулярным интервалом времени.

Я хотел бы создать новый data.frame и присоединить к нему другие, для каждого присоединяемого data.frame выбирая последнее значение из нового data.frame.

Например, listOfDataFrames ниже содержит список data.frames, каждый из которых имеет временной столбец в секундах. Я нахожу общий диапазон, изменяю диапазон на 60 и последовательно увеличиваю его до полных минут. Теперь мне нужно объединить список data.frames слева от этой новой последовательности. например если значение в mypoints равно 60, значение, присоединенное к нему, должно быть самым последним значением <= 60. </p>

xrange <- range(lapply(listOfDataFrames,function(x) range(x$Time)))
mypoints <- 60*do.call(seq,as.list(xrange%/%60))

Я полагаю, это иногда называют asof join.

Есть ли простая процедура для этого?

Спасибо

РЕДАКТИРОВАТЬ: это то, что я сейчас использую

xrange <- range(lapply(listOfDataFrames,function(x) range(x$Time)))
mypoints <- 60*seq(xrange[1]%/%60,1+xrange[2]%/%60)
result <- data.frame(Time=mypoints)
for(index in 1:length(listOfDataFrames))
{
  x<-listOfDataFrames[[index]]
  indices <- which(sort(c(mypoints,x$Time)) %in% mypoints) - 1:length(mypoints)
  indices[indices==0] <- NA
  newdf<-data.frame(new=x$Result[indices])
  colnames(newdf)<-paste("S",index,sep="")
  result <- cbind(result,newdf)
}

РЕДАКТИРОВАТЬ: полный пример

AsOfJoin <- function (listOfDataFrames) {
  xrange <- range(lapply(listOfDataFrames,function(x) range(x$Time)))
  mypoints <- 60*seq(xrange[1]%/%60,1+xrange[2]%/%60)
  result <- data.frame(Time=mypoints)
  for(index in 1:length(listOfDataFrames))
  {
    x<-listOfDataFrames[[index]]
    indices <- which(sort(c(mypoints,x$Time)) %in% mypoints) - 1:length(mypoints)
    indices[indices==0] <- NA
    newdf<-data.frame(new=x$Result[indices])
    colnames(newdf)<-paste("S",index,sep="")
    result <- cbind(result,newdf)
  }
  result[is.na(result)]<-0
  result
}


a<-data.frame(Time=c(28947.5,28949.6,29000),Result=c(10,15,9))
b<-data.frame(Time=c(28947.8,28949.5),Result=c(14,19))
listOfDataFrames <- list(a,b)
result<-AsOfJoin(listOfDataFrames)

    > a
         Time Result
    1 28947.5     10
    2 28949.6     15
    3 29000.0      9
    > b
         Time Result
    1 28947.8     14
    2 28949.5     19
    > result
       Time S1 S2
    1 28920  0  0
    2 28980 15 19
    3 29040  9 19

Ответы [ 2 ]

1 голос
/ 11 января 2013

data.table обеспечивают очень быстрое asof соединение из коробки.См. Также Этот пост для примера

0 голосов
/ 17 июля 2011

Смотрите мой ответ для ответа.Видимо лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...