0

我有 3 个数据帧:

# build first data.frame
Date1 = seq(from = as.POSIXct("1991-01-01 00:00"), 
           to = as.POSIXct("1991-12-31 23:00"), by = 60)
Dat1 <- data.frame(DateTime = Date1,
                    x1 = rnorm(length(Date1)))

# build second data.frame
Date2 <- seq(from = as.POSIXct("1991-03-01 03:30"), 
             to = as.POSIXct("1991-11-23 22:00"), by = 60)
Dat2 <- data.frame(DateTime = Date2,
                   x1 = rnorm(length(Date2)))

# build third data.frame
Date3 <- seq(from = as.POSIXct("1991-02-08 01:30"), 
             to = as.POSIXct("1991-08-23 11:00"), by = 60)
Dat3Matrix <- matrix(data = rnorm(length(Date3)*3), ncol = 3)

Dat3 <- data.frame(DateTime = Date3,
                   x1 = Dat3Matrix)

我现在正试图从三个 data.frames 中删除不包含在其他数据帧中的时间段(如果这有意义的话)。最终,我的目标是让三个数据框具有相同的开始和结束日期。我该怎么做呢?

我在想一些事情:

newDat1 <- subset(Dat1,Dat1$DateTime %in% Dat2$DateTime)

但我一直在寻找一种方法将其应用于任意数量的数据帧,例如,如果我有 10 个数据帧,该方法仍然有效。我生成的函数应该对所有数据帧进行子集化,并以相同的开始和结束日期返回它们。

所以,我想生成一个函数,它接受任意数量的数据帧,然后返回具有相同开始和结束日期的相同数据帧,这可能吗?

4

2 回答 2

2

尝试这样的事情:

  • 创建一个将list数据帧作为输入的函数
  • 用于查找列表中每个元素的lapply最小值和最大值DateTime
  • 使用do.callwithrbind将结果拼接到数据框中
  • 找到最小值的最大值和最大值的最小值,即日期范围
  • 再用lapply一次做子集

编码:

foo <- function(ldf){
  x <- lapply(ldf, function(x)data.frame(min=min(x$DateTime), max=max(x$DateTime)))
  x <- do.call(rbind, x)
  bounds <- with(x, c(max(min), min(max)))
  lapply(ldf, function(x)x[x$DateTime >= bounds[1] & x$DateTime <= bounds[2], ])
}

x <- foo(list(Dat1, Dat2, Dat3))
str(x)

结果:

List of 3
 $ :'data.frame':   252391 obs. of  2 variables:
  ..$ DateTime: POSIXct[1:252391], format: "1991-03-01 03:30:00" "1991-03-01 03:31:00" ...
  ..$ x1      : num [1:252391] 0.2393 0.6831 1.5666 0.0303 -1.1226 ...
 $ :'data.frame':   252391 obs. of  2 variables:
  ..$ DateTime: POSIXct[1:252391], format: "1991-03-01 03:30:00" "1991-03-01 03:31:00" ...
  ..$ x1      : num [1:252391] -0.555 0.231 1.212 0.363 -0.943 ...
 $ :'data.frame':   252391 obs. of  4 variables:
  ..$ DateTime: POSIXct[1:252391], format: "1991-03-01 03:30:00" "1991-03-01 03:31:00" ...
  ..$ x1.1    : num [1:252391] 0.4729 0.8238 1.8854 -0.0781 -1.5236 ...
  ..$ x1.2    : num [1:252391] 1.002 -0.546 0.279 -0.817 -0.844 ...
  ..$ x1.3    : num [1:252391] -0.616 1.313 -0.856 0.648 -0.593 ...
于 2013-04-29T11:58:36.077 回答
1

首先,在这种情况下,我总是将所有data.frames 收集在 alist中,您可以使用以下方法轻松迭代lapply

mydata <- list( Dat1, Dat2, Dat3, ... )

如果您正在寻找所有 DateTime 列的交集,您可以通过以下方式轻松完成此操作:

datcols <- lapply( mydata, function(x) x$DateTime )
isec <- Reduce( intersect, datcols )

最后,您可以data.frame通过

lapply( mydata, function(x) x[ x$DateTime %in% isec, ] )
于 2013-04-29T12:16:10.273 回答