Преобразование списка списков (случайно созданных с использованием read_docx) в data.frame - PullRequest
0 голосов
/ 30 июня 2018

Я загружаю кучу файлов docx в список, а затем пытаюсь преобразовать полученный список списков во фрейм данных.

Приведенный ниже воспроизводимый пример не читает файлы docx, он просто демонстрирует тот код, который я написал

# 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

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Нашел простой ответ:

as.data.frame (unlist (у))

элегантно заменяет всю лапу и функцию броухаха

0 голосов
/ 30 июня 2018

Если кто-то хочет избежать именования имен переменных (например, 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
0 голосов
/ 30 июня 2018

Мне проще преобразовать все элементы во фрейм данных, а затем объединить их вместе.

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