R合并data.frames asof join

时间:2011-07-05 16:22:57

标签: r join dataframe

我有一大堆data.frames,时间间隔不规则。

我想创建一个新的data.frame并加入其他数据框,为每个data.frame加入,从新的data.frame中选择最新的值。

例如,下面的listOfDataFrames包含一个data.frames列表,每个都有一个以秒为单位的时间列。我找到总范围,将范围调整为60并将其乘以获得增加的完整分钟数。现在我需要将data.frames列表合并到这个新seqn的左侧。例如如果mypoints中的值为60,则加入它的值应为最新值< = 60。

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

我相信这有时被称为加入。

有一个简单的程序吗?

由于

编辑:这是我目前使用的

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 个答案:

答案 0 :(得分:1)

data.table提供非常快速的asof加入功能。 另请参阅This post以获取示例

答案 1 :(得分:0)

请参阅我的编辑以获得答案。显然是最好的方式。