Почему можно использовать функцию unlist ()? (пример внутри) - PullRequest
0 голосов
/ 12 июля 2020
• 1000 1005 *

Он приступает к созданию двух векторов (это правда? Когда-то извлечено и исключено из списка?)

Я не понимаю, для чего здесь служит функция unlist. Я видел, как функция unlist использовалась перед построением графика, и не понимаю, какая разница? введите описание изображения здесь

Ответы [ 3 ]

3 голосов
/ 12 июля 2020

функции dplyr, такие как filter() и select(), возвращают тиблицы (вариант для data.frames). Фреймы данных и таблицы - это особый тип списка, где каждый элемент является вектором одинаковой длины, но не обязательно одного и того же типа.

В приведенном примере каждый оператор выбирает один столбец, возвращаемый как таблица с 1 столбцом. Таблица с 1 столбцом - это список с одним элементом, в данном случае вектором Bodyweights. Однако многие функции не ожидают тиббла с 1 столбцом (или data.frame), а хотят иметь вектор. Используя unlist(), мы сжимаем структуру до одного вектора. Это будет верно независимо от того, выбрали ли вы один столбец или несколько столбцов.

Идиоматический способ c в dplyr будет заключаться в перенаправлении pull(Bodyweight), а не при использовании unlist().

Рассмотрим этот простой пример для разницы

tib <- tibble(a = 1:5, b = letters[1:5])
select(tib, a)
class(select(tib, a))
# Notice the different printing and class when we unlist
unlist(select(tib, a))
class(unlist(select(tib, a))
1 голос
/ 12 июля 2020

Назначение unlist - это сглаживание списка векторов в один вектор. Это из R для науки о данных . Его, безусловно, стоит прочитать.

См. Дальнейшие объяснения в комментариях ниже.

library(tidyverse)


head(data)
#>   Diet Bodyweight
#> 1 chow      21.51
#> 2 chow      28.14
#> 3 chow      24.04
#> 4 chow      23.45
#> 5 chow      23.68
#> 6 chow      19.79
# without unlist you get a data.frame
dplyr::filter(data, Diet == 'chow') %>% select(Bodyweight) %>% class()
#> [1] "data.frame"

# by unlisting you get a named vector with the names taken from the selected data
dplyr::filter(data, Diet == 'chow') %>% select(Bodyweight) %>% unlist()
#>  Bodyweight1  Bodyweight2  Bodyweight3  Bodyweight4  Bodyweight5  Bodyweight6 
#>        21.51        28.14        24.04        23.45        23.68        19.79 
#>  Bodyweight7  Bodyweight8  Bodyweight9 Bodyweight10 Bodyweight11 Bodyweight12 
#>        28.40        20.98        22.51        20.10        26.91        26.25

# If you set use.names=F you get a vector with the data you selected
dplyr::filter(data, Diet == 'chow') %>% select(Bodyweight) %>% unlist(use.names = F)
#>  [1] 21.51 28.14 24.04 23.45 23.68 19.79 28.40 20.98 22.51 20.10 26.91 26.25
1 голос
/ 12 июля 2020

Ну, это просто зависит от того, чего вы хотите достичь. Перед unlist () вы получите data.frame (или более конкретный c tibble в этом примере из-за функциональности dplyr, примененной к данным). При выводе из списка одного столбца тиббла вы получите вектор atomi c numeri c (named), который в некоторых ситуациях ведет себя совершенно иначе (последний пример rbind ниже).

library(tidyverse)
mice <- structure(list(Diet=c("chow","chow","chow","chow","chow",
"chow","chow","chow","chow","chow","chow","chow","hf",
"hf","hf","hf","hf","hf","hf","hf","hf","hf","hf","hf"
),Bodyweight=c(21.51,28.14,24.04,23.45,23.68,19.79,28.4,
20.98,22.51,20.1,26.91,26.25,25.71,26.37,22.8,25.34,
24.97,28.14,29.58,30.92,34.02,21.9,31.53,20.73)),class=c("spec_tbl_df",
"tbl_df","tbl","data.frame"),row.names=c(NA,-24L),spec=structure(list(
cols=list(Diet=structure(list(),class=c("collector_character",
"collector")),Bodyweight=structure(list(),class=c("collector_double",
"collector"))),default=structure(list(),class=c("collector_guess",
"collector")),skip=1),class="col_spec"))

bodyweight <- mice %>% filter(Diet == "chow") %>% select(Bodyweight)
class(bodyweight)
#> [1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame"
bodyweight
#> # A tibble: 12 x 1
#>    Bodyweight
#>         <dbl>
#>  1       21.5
#>  2       28.1
#>  3       24.0
#>  4       23.4
#>  5       23.7
#>  6       19.8
#>  7       28.4
#>  8       21.0
#>  9       22.5
#> 10       20.1
#> 11       26.9
#> 12       26.2

bodyweight_unl <- mice %>% filter(Diet == "chow") %>% select(Bodyweight) %>% unlist
class(bodyweight_unl)
#> [1] "numeric"
bodyweight_unl
#>  Bodyweight1  Bodyweight2  Bodyweight3  Bodyweight4  Bodyweight5  Bodyweight6 
#>        21.51        28.14        24.04        23.45        23.68        19.79 
#>  Bodyweight7  Bodyweight8  Bodyweight9 Bodyweight10 Bodyweight11 Bodyweight12 
#>        28.40        20.98        22.51        20.10        26.91        26.25

rbind(bodyweight, 1:12)
rbind(bodyweight_unl, 1:12)

Создано 12.07.2020 с помощью пакета . (v0.3.0)

...