【问题标题】:Combine a list of data frames into one preserving row names将数据框列表合并为一个保留行名称
【发布时间】: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.fillbind_rowsrbindlist 中的任何一个时,行名将替换为数字范围:

> 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


【解决方案1】:

要保留行名,您可以这样做:

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))

【讨论】:

  • 有时候生活就是这么简单。谢谢。
  • 你快到了!至少你知道 setNames 和 unname !
  • 天才!很好的解决方案
【解决方案2】:

我们可以在绑定前使用dplyr包中的add_rownames

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

【讨论】:

  • 很高兴了解add_rownames,但在我的情况下并不适合我。
  • @Midnighter 如果行名在 a、b 和 c 中重叠怎么办?
  • 我确信他们不会出现在我的场景中,但这是一个有效的观点,当然。
【解决方案3】:

为什么不只使用rbind

 rbind(l$A, l$B, l$C)

【讨论】:

  • 我不能在我的实际示例中使用这种方法,因为我通过一个向量对完整列表进行子设置,例如 l[c("A", "C")],但当然是从其他值计算出来的。
  • 我明白了。所以其他答案会更有帮助。我将把这个答案留在这里,以便其他人知道你在寻找什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2021-05-16
  • 2021-12-28
  • 1970-01-01
相关资源
最近更新 更多