尽管这里已经有一些很好的答案,但我只想添加我一直在使用的答案。它是基础的R
,因此如果您想在一个包中使用它,它的限制可能会更少,而且它比其他一些基础R
解决方案要快一点。
dfs <- list(df1 = data.frame("x"=c(1,2), "y"=2),
df2 = data.frame("x"=c(2,4), "y"=4),
df3 = data.frame("x"=2, "y"=c(4,5,7)))
> microbenchmark(cbind(do.call(rbind,dfs),
rep(names(dfs), vapply(dfs, nrow, numeric(1)))), times = 1001)
Unit: microseconds
min lq mean median uq max neval
393.541 409.083 454.9913 433.422 453.657 6157.649 1001
第一部分,do.call(rbind, dfs)
将数据帧的行绑定到单个数据帧中。vapply(dfs, nrow, numeric(1))
查找每个数据框有多少行,这些行被传递给以rep
对rep(names(dfs), vapply(dfs, nrow, numeric(1)))
数据框的每一行重复数据框的名称一次。 cbind
把它们放在一起。
这类似于之前发布的解决方案,但速度提高了约 2 倍。
> microbenchmark(do.call(rbind,
lapply(names(dfs), function(x) cbind(dfs[[x]], source = x))),
times = 1001)
Unit: microseconds
min lq mean median uq max neval
844.558 870.071 1034.182 896.464 1210.533 8867.858 1001
我不是 100% 确定,但我相信加速是由于对cbind
每个数据帧进行一次调用而不是一次调用。