преобразование именованного списка со смешанным содержимым в фрейм данных

#r #list #dataframe #dplyr #data-conversion

Вопрос:

Существует ли лучший и более приятный способ преобразования именованного списка со смешанным содержимым в фрейм данных?

Рабочий пример:

 my_list <- list("a" = 1.0, "b" = "foo", "c" = TRUE)

my_df <- data.frame(
  "key" = names(my_list),
  stringsAsFactors = F
)

my_df[["value"]] <- unname(my_list)
 

Возможно ли выполнить это преобразование за один шаг?

Ответ №1:

Мы можем использовать stack от base R

 stack(my_list)
 

Согласно с ?stack

Функция стека используется для преобразования данных, доступных в виде отдельных столбцов во фрейме данных или списке, в один столбец, который может быть использован в модели дисперсионного анализа или другой линейной модели. Функция unstack отменяет эту операцию.


Или с enframe

 library(tidyverse)
enframe(my_list) %>% # creates the 'value' as a `list` column
   mutate(value = map(value, as.character)) %>% # change to single type
   unnest 
 

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

1. Привет @akun, stack это просто и быстро, но я не нахожу справочный документ. Вы хотели бы добавить имя пакета (база?) или немного объяснить его?

2.@Jiaxiang это от base R . Согласно ?stack The stack function is used to transform data available as separate columns in a data frame or list into a single column that can be used in an analysis of variance model or other linear model. The unstack function reverses this operation. с. Здесь это именованный список. Таким образом, он отменяет список значений и в то же время копирует имена списка в отдельный столбец

3. @akrun если я правильно понимаю, stack для решения требуется еще один шаг, colnames чтобы изменить имена столбцов на ключ и значение ? Нет другого способа сделать это за одну операцию?

4. @RSzT Вы можете использовать setNames(stack(my_list)[2:1], c("key", "value")) , поскольку столбцы по умолчанию называются » ind » и «значения», где, как и в enframe , есть возможность изменить имя в аргументе

5. @akrun Кажется, что ind столбец (или key после выше) является фактором.

Ответ №2:

Вы можете использовать dplyr::as_tibble для принудительного преобразования списка в фрейм данных / tibble. Это автоматически создаст фрейм данных, в котором имена списка будут именами столбцов, а элементы списка будут соответствовать строкам.

 library(dplyr)
library(tidyr)

my_list <- list("a" = 1.0, "b" = "foo", "c" = TRUE)

as_tibble(my_list)
#> # A tibble: 1 x 3
#>       a b     c    
#>   <dbl> <chr> <lgl>
#> 1     1 foo   TRUE
 

Чтобы изменить формат в два столбца, который у вас есть , передайте его по tidyr::gather каналу, где имена столбцов по умолчанию-ключ и значение. Из-за различных типов данных в столбце value это приведет к принудительному переводу всех значений в символьные.

 as_tibble(my_list) %>%
  gather()
#> # A tibble: 3 x 2
#>   key   value
#>   <chr> <chr>
#> 1 a     1    
#> 2 b     foo  
#> 3 c     TRUE
 

Создано в 2018-11-09 с помощью пакета reprex (v0.2.1)