将一组数据框组合成一个保留行名的列表
Combine a list of data frames into one preserving row names
我知道将数据帧列表合并为一个的基础知识 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"
那么有没有我缺少的函数可以更好地控制行名称?我确实需要不同上下文的名称,因此删除它们是次优的。
要保留行名,您只需执行以下操作:
do.call(rbind, unname(l))
# x
#a 1
#b 2
#c 3
#d 4
#e 5
#f 6
#g 7
#h 8
#i 9
或者正如您通过将 l
的行名设置为 NULL
下划线一样,这也可以通过以下方式完成:
do.call(rbind, setNames(l, NULL))
为什么不只使用 rbind
:
rbind(l$A, l$B, l$C)
我们可以在绑定前使用 add_rownames 来自 dplyr 包:
rbind_all(lapply(l, add_rownames))
# Source: local data frame [9 x 2]
#
# rowname x
# 1 a 1
# 2 b 2
# 3 c 3
# 4 d 4
# 5 e 5
# 6 f 6
# 7 g 7
# 8 h 8
# 9 i 9
我知道将数据帧列表合并为一个的基础知识 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"
那么有没有我缺少的函数可以更好地控制行名称?我确实需要不同上下文的名称,因此删除它们是次优的。
要保留行名,您只需执行以下操作:
do.call(rbind, unname(l))
# x
#a 1
#b 2
#c 3
#d 4
#e 5
#f 6
#g 7
#h 8
#i 9
或者正如您通过将 l
的行名设置为 NULL
下划线一样,这也可以通过以下方式完成:
do.call(rbind, setNames(l, NULL))
为什么不只使用 rbind
:
rbind(l$A, l$B, l$C)
我们可以在绑定前使用 add_rownames 来自 dplyr 包:
rbind_all(lapply(l, add_rownames))
# Source: local data frame [9 x 2]
#
# rowname x
# 1 a 1
# 2 b 2
# 3 c 3
# 4 d 4
# 5 e 5
# 6 f 6
# 7 g 7
# 8 h 8
# 9 i 9