从可用的最小向量创建数据框

时间:2018-08-04 00:33:57

标签: r dataframe

我想从数据框列表中创建一个数据框,特别是从这些数据框的特定列中创建一个数据框。但是,每个数据帧包含不同数量的观察值,因此以下代码给我一个错误。

diffs <- data.frame(sensor1 = sensores[[1]]$Diff,
                    sensor2 = sensores[[2]]$Diff,
                    sensor3 = sensores[[3]]$Diff,
                    sensor4 = sensores[[4]]$Diff,
                    sensor5 = sensores[[5]]$Diff)

错误:

Error in data.frame(sensor1 = sensores[[1]]$Diff, sensor2 = sensores[[2]]$Diff,  : 
arguments imply differing number of rows: 29, 19, 36, 26

是否有某种方法可以迫使data.frame()占用每一列中的最小数目或行数,在这种情况下为19?

也许R中有一个内置函数可以做到这一点,任何解决方案都值得赞赏,但我希望获得尽可能通用和清晰的内容。

谢谢。

1 个答案:

答案 0 :(得分:1)

我可以想到两种方法:

示例数据:

df1 <- data.frame(A = 1:3)
df2 <- data.frame(B = 1:4)
df3 <- data.frame(C = 1:5)

计算最小数据帧的行数:

min_rows <- min(sapply(list(df1, df2, df3), nrow))

组合时使用子集:

diffs <- data.frame(a = df1[1:min_rows,], b = df2[1:min_rows,], c = df3[1:min_rows,] )
diffs
  a b c
1 1 1 1
2 2 2 2
3 3 3 3

或者,使用merge

rowmerge <- function(x,y){
   # create row indicators for the merge:
   x$ind <- 1:nrow(x)
   y$ind <- 1:nrow(y)
   out <- merge(x,y, all = T, by = "ind")
   out["ind"] <- NULL
   return(out)
}
Reduce(rowmerge, list(df1, df2, df3))
   A  B C
1  1  1 1
2  2  2 2
3  3  3 3
4 NA  4 4
5 NA NA 5

要摆脱带有NA的行,请删除all = T

对于您的特定情况,假设Reduce(rowmerge, sensores)是数据帧列表,您可能会调用sensores

注意:如果您已经在某个地方有索引(例如某种时间戳),则建议仅在该索引上合并而不是创建ind