【发布时间】:2015-09-17 08:31:23
【问题描述】:
我确实知道将数据框列表合并为一个的基础知识,就像 been answered before 一样。但是,我对维护行名的智能方法很感兴趣。假设我有一个相当相等的数据框列表,并将它们保存在一个命名列表中。
library(plyr)
library(dplyr)
library(data.table)
a = data.frame(x=1:3, row.names = letters[1:3])
b = data.frame(x=4:6, row.names = letters[4:6])
c = data.frame(x=7:9, row.names = letters[7:9])
l = list(A=a, B=b, C=c)
当我使用do.call 时,列表名称与行名称组合在一起:
> rownames(do.call("rbind", l))
[1] "A.a" "A.b" "A.c" "B.d" "B.e" "B.f" "C.g" "C.h" "C.i"
当我使用 rbind.fill、bind_rows 或 rbindlist 中的任何一个时,行名将替换为数字范围:
> rownames(rbind.fill(l))
> rownames(bind_rows(l))
> rownames(rbindlist(l))
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"
当我从列表中删除名称时,do.call 会产生所需的输出:
> names(l) = NULL
> rownames(do.call("rbind", l))
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i"
那么,我是否缺少一个可以更好地控制行名的函数?我确实需要不同上下文的名称,因此删除它们是次优的。
【问题讨论】:
-
Hadley 以及 hadleyverse 并不真正支持行名,因此您不太可能获得这些包中的任何一个来保留行名。
-
使用
data.table你也许可以使用rbindlist(lapply(l, setDT, keep.rownames = TRUE))虽然不确定效率。 -
使用
dplyr::add_rownames()
标签: r data.table plyr dplyr