的R - 发现数据帧的n个相同的次(r - find same times in n number

2019-10-28 19:23发布

请看下面的例子:

Date1 = seq(from = as.POSIXct("2010-05-03 00:00"), 
            to = as.POSIXct("2010-06-20 23:00"), by = 120)
Dat1 <- data.frame(DateTime = Date1,
                   x1 = rnorm(length(Date1)))

Date2 <- seq(from = as.POSIXct("2010-05-01 03:30"), 
             to = as.POSIXct("2010-07-03 22:00"), by = 120)
Dat2 <- data.frame(DateTime = Date2,
                   x1 = rnorm(length(Date2)))

Date3 <- seq(from = as.POSIXct("2010-06-08 01:30"), 
             to = as.POSIXct("2010-07-13 11:00"), by = 120)
Dat3Matrix <- matrix(data = rnorm(length(Date3)*3), ncol = 3)

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

list1 <- list(Dat1,Dat2,Dat3)

在这里,我建三个data.frames作为一个例子,把它们全部放入一个列表。 在这里,我想编写一个程序,将返回3个数据帧,但只保留这是存在于每个人的时间,即所有三个数据帧应减少到是在所有的数据帧的一致倍。 如何才能做到这一点?

Answer 1:

zoo具有多路合并。 这lapply的read.zoo过的部件list1它们各自转换成动物园类。 tz=""告诉它使用POSIXct为生成的日期/时间。 然后,它使用合并所转换的组件all=FALSE使得仅相交时间被保持。

library(zoo)
z <- do.call("merge", c(lapply(setNames(list1, 1:3), read.zoo, tz = ""), all = FALSE))

如果我们以后要转换z到data.frame尝试dd <- cbind(Time = time(z), coredata(z))但它可能会更好,以保持它作为一个动物园对象(或将其转换为一个XTS对象)以便进一步的处理被简化,以及。



Answer 2:

一种方法是找到相应的指数,然后相应子集:

idx1 <- (Dat1[,1] %in% Dat2[,1]) & (Dat1[,1] %in% Dat3[,1])
idx2 <- (Dat2[,1] %in% Dat1[,1]) & (Dat2[,1] %in% Dat3[,1])
idx3 <- (Dat3[,1] %in% Dat1[,1]) & (Dat3[,1] %in% Dat2[,1])

现在Dat1[idx1,]Dat2[idx2,]Dat3[idx3,]应该给所期望的结果。



Answer 3:

您可以使用merge

res <- NULL
for (i in 2:length(list1)) {
  dat <- list1[[i]]
  names(dat)[2] <- paste0(names(dat)[2], "_", i);
  dat[[paste0("id_", i)]] <- 1:nrow(dat)

  if (is.null(res)) {
    res <- dat
  } else {
    res <- merge(res, dat, by="DateTime")
  }
}

我添加了ID的列; 你可以在原来的data.frames使用这些指标记录



文章来源: r - find same times in n number of data frames
标签: r subset