Преобразовать список списка векторов в Dataframe в R

#r #list #dataframe #concatenation

#r #Список #фрейм данных #Конкатенация

Вопрос:

Речь идет о преобразовании списков в R.

Мои данные выглядят следующим образом:

 >data = list(list(c('a', 'b'), c('c', 'd')), list(c('a', 'b', 'c'), c('d', 'e', 'f'), c('g', 'h', 'i')))
>data
[[1]]
[[1]][[1]]
[1] "a" "b"

[[1]][[2]]
[1] "c" "d"


[[2]]
[[2]][[1]]
[1] "a" "b" "c"

[[2]][[2]]
[1] "d" "e" "f"

[[2]][[3]]
[1] "g" "h" "i"
  

Я хотел бы объединить каждый вектор подсписков, например paste("a", "b") = "a b") , чтобы весь список можно было преобразовать в dataframe, который выглядит следующим образом:

 > df <- data.frame(col1 = c("a b", "c d", NA), col2 = c("a b c", "d e f", "g h i"))
> df
  col1  col2
1  a b a b c
2  d e d e f
3 <NA> g h i
  

Я попытался решить эту проблему сейчас с помощью apply-функций в R, но это действительно не моя территория… Заранее спасибо за вашу помощь!

Ответ №1:

Вот что-то. Мы используем две вспомогательные функции из data.table transpose() и setDF() .

 library(data.table)
nrs <- max(lengths(data))

df <- setDF(
  lapply(lapply(data, transpose), function(x) do.call(paste, x)[1:nrs])
)
df
#     V1    V2
# 1  a b a b c
# 2  c d d e f
# 3 <NA> g h i
  

Редактировать:

Решение без зависимостей:

 as.data.frame(sapply(data, function(x) sapply(x, paste, collapse = " ")[1:nrs]))
  

Комментарии:

1. каким-то образом строка nrs <- max(unlist(sapply(data, lengths))) находит не самый длинный подсписок, а самый короткий. Кроме того, оба решения работают отлично. спасибо

2. @hyhno01 проблема с nrs должна быть исправлена.