【问题标题】:Converting a list of lists (incidentally created using read_docx) into a data.frame将列表列表(顺便使用 read_docx 创建)转换为 data.frame
【发布时间】:2018-12-09 07:03:04
【问题描述】:

我将一堆 docx 文件加载到一个列表中,然后尝试将生成的列表列表转换为数据框。

下面的可重现示例不读取 docx 文件,它只是演示了我编写的 lapply 代码

# Creating a list to somewhat
# replicate the list of lists
# I get from lapply read_docx

a <- c("1","0","art","3","4")
x <- cbind(as.data.frame(a),as.data.frame(a),as.data.frame(a))
b <- c("a", "b", "c")
names(x) = b
y <- as.list(x)
shingled <- as.data.frame("a")
names(shingled) = "vaaar"

# putting together each list in
# y into a single data frame
# Note: even though as.data.frame(y[1])
# gives, surprise surprise, a data frame,
# the code below returns a list

all <- lapply(y, function(x){
  exer <- as.data.frame(x)
  names(exer) = "vaaar"
  shingled <- rbind(shingled,
                    exer)}
  )

此处提供了相同的代码: https://pastebin.com/rw24jaMN

【问题讨论】:

  • 您的预期输出是什么?如果你能提供,那么建议解决方案会更容易。

标签: r list dataframe lapply


【解决方案1】:

对我来说,将每个元素转换为数据框然后将它们组合在一起更容易。

all_dat <- do.call(rbind, lapply(y, as.data.frame))
names(all_dat) <- "vaaar"

all_dat
#     vaaar
# a.1     1
# a.2     0
# a.3   art
# a.4     3
# a.5     4
# b.1     1
# b.2     0
# b.3   art
# b.4     3
# b.5     4
# c.1     1
# c.2     0
# c.3   art
# c.4     3
# c.5     4

我并不完全清楚您想要的输出是什么,但do.call(rbind, ...) 也适用于您创建的列表。

all_dat <- do.call(rbind, all)

all_dat
#     vaaar
# a.1     a
# a.2     1
# a.3     0
# a.4   art
# a.5     3
# a.6     4
# b.1     a
# b.2     1
# b.3     0
# b.4   art
# b.5     3
# b.6     4
# c.1     a
# c.2     1
# c.3     0
# c.4   art
# c.5     3
# c.6     4

【讨论】:

  • 谢谢!找到了另一个简单的解决方案 - unlist
【解决方案2】:

找到了一个简单的答案:

as.data.frame(unlist(y))

优雅地替换了整个 lapply 和函数 brouhaha

【讨论】:

    【解决方案3】:

    如果有人想避免命名变量名称(例如a.1, a.2...b.1,b.2 etc)并想使用dplyr链,则解决方案可能如下:

    library(tidyverse)
    bind_rows(y) %>% gather(Key, "vaaar") %>% as.data.frame()
    
    #    Key vaaar
    # 1    a     1
    # 2    a     0
    # 3    a   art
    # 4    a     3
    # 5    a     4
    # 6    b     1
    # 7    b     0
    # 8    b   art
    # 9    b     3
    # 10   b     4
    # 11   c     1
    # 12   c     0
    # 13   c   art
    # 14   c     3
    # 15   c     4
    

    【讨论】:

    • meltmelt(y, value.name = "vaar")[-2]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多