#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)