【问题标题】:How to convert list of dataframe to dataframe which has a new column show the name of list in R如何将数据框列表转换为具有新列的数据框显示 R 中列表的名称
【发布时间】:2014-09-30 07:22:29
【问题描述】:

我有一个数据框列表,对于每个列表,我都有一个名称,即 USERID,以下是列表示例:

$'AAAAAA'
AA  BB  CC
a   b   1
c   d   2
e   f   3
S'BBBBBB'
AA  BB  CC
g   h   1
i   j   2
k   l   3

我的问题是如何将此列表转换为具有显示 USERID 的新列的数据框,如以下示例:

AA  BB  CC  USERID
a   b   1   AAAAAA
c   d   2   AAAAAA
e   f   3   AAAAAA
g   h   1   BBBBBB
i   j   2   BBBBBB
k   l   3   BBBBBB

任何想法如何完成。提前非常感谢您

【问题讨论】:

  • 如果l 是您的列表,请尝试df <- do.call(rbind, l) ; df$USERID <- gsub("[.]\\d", "", row.names(df))
  • 这已经回答过好几次了,例如here, here, here, here.

标签: r list dataframe typeconverter


【解决方案1】:

由于cbind将其参数循环为最长向量的长度,您可以尝试

Reduce(rbind, Map(cbind, x, USERID = names(x)))
#   AA BB CC USERID
# 1  a  b  1  AAAAA
# 2  c  d  2  AAAAA
# 3  e  f  3  AAAAA
# 4  g  h  1  BBBBB
# 5  i  j  2  BBBBB
# 6  k  l  3  BBBBB

x 在哪里

structure(list(AAAAA = structure(list(AA = c("a", "c", "e"), 
    BB = c("b", "d", "f"), CC = 1:3), .Names = c("AA", "BB", 
"CC"), class = "data.frame", row.names = c(NA, -3L)), BBBBB = structure(list(
    AA = c("g", "i", "k"), BB = c("h", "j", "l"), CC = 1:3), .Names = c("AA", 
"BB", "CC"), class = "data.frame", row.names = c(NA, -3L))), .Names = c("AAAAA", 
"BBBBB"))

【讨论】:

  • 太棒了,是的,这正是我想要实现的!谢谢,理查德。
  • @user3758587 - 实际上我刚刚更改了它。现在好多了
  • 我试过你的新脚本,它也可以。非常感谢您的努力。顺便说一句,我也试过大卫的方法,data.table 快得多。
  • 我一点也不惊讶:)
  • 天哪,R 用户对他们的选票很吝啬。刚刚为你们所有人提供了不错的现代选择....
【解决方案2】:

另一种方式,使用tidyr的开发版:

# install.packages("devtools")
devtools::install_github("hadley/tidyr")
library(tidyr)

unnest(mylist, USERID)
#   USERID AA BB CC
# 1  AAAAA  a  b  1
# 2  AAAAA  c  d  2
# 3  AAAAA  e  f  3
# 4  BBBBB  g  h  1
# 5  BBBBB  i  j  2
# 6  BBBBB  k  l  3

【讨论】:

  • 我的 0.1 版本的 tidyr 中怎么没有 unnest?
  • 前几天看到这个新功能我才知道。您需要获取 github 版本。 unnest() 尚未正式发布。 github.com/hadley/tidyr/blob/master/man/unnest.Rd
  • @jazzurro +1,最好在帖子中显示清楚。 library('devtools');install_github('hadley/tidyr'); library(tidyr)
  • @akrun 谢谢你。我会从下次开始这样做。
【解决方案3】:

或者(如果l 是您的列表)

library(data.table)
rbindlist(Map(cbind, l, USERID = names(l)))
#    AA BB CC USERID
# 1:  a  b  1 AAAAAA
# 2:  c  d  2 AAAAAA
# 3:  e  f  3 AAAAAA
# 4:  g  h  1 BBBBBB
# 5:  i  j  2 BBBBBB
# 6:  k  l  3 BBBBBB

【讨论】:

    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 2020-07-29
    • 2015-11-14
    • 2020-07-14
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多