我想从数据框列表中创建一个数据框,特别是从这些数据框的特定列中创建一个数据框。但是,每个数据帧包含不同数量的观察值,因此以下代码给我一个错误。
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中有一个内置函数可以做到这一点,任何解决方案都值得赞赏,但我希望获得尽可能通用和清晰的内容。
谢谢。
答案 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
。