Как ссылаться на столбец во вложенном фрейме данных (затем используйте purrr :: map) - PullRequest
0 голосов
/ 16 июня 2020

У меня очень простой вопрос о ссылках на столбцы данных во вложенном фрейме данных.

Для воспроизводимого примера я вложу mtcars по двум значениям переменной am:

library(tidyverse)
mtcars_nested <- mtcars %>% 
  group_by(am) %>% 
  nest()
mtcars_nested

, что дает данные, которые выглядят следующим образом.

#> # A tibble: 2 x 2
#> # Groups:   am [2]
#>      am data              
#>   <dbl> <list>            
#> 1     1 <tibble [13 × 10]>
#> 2     0 <tibble [19 × 10]>

Если бы я теперь хотел использовать purrr::map, чтобы взять среднее значение mpg для каждого уровня am

Интересно, почему это не работает:


take_mean_mpg <- function(df){
  mean(df[["data"]]$mpg)
}

map(mtcars_nested, take_mean_mpg)
Error in df[["data"]] : subscript out of bounds

Или, может быть, более простой вопрос: как мне правильно ссылаться на столбец mpg, если он вложен. Я знаю, что это не работает:

mtcars_nested[["data"]]$mpg

Ответы [ 2 ]

1 голос
/ 16 июня 2020

dataframes (и tbls) - это списки столбцов, а не списки строк, поэтому, когда вы передаете весь tbl mtcars_nest в map(), он выполняет итерацию по столбцам, а не по строкам. Вы можете использовать mutate со своей функцией и map_dbl, чтобы ваши новые столбцы не были столбцами списка.

library(tidyverse)
mtcars_nested <- mtcars %>% 
  group_by(am) %>% 
  nest()
mtcars_nested

take_mean_mpg <- function(df){
  mean(df$mpg)
}

mtcars_nested %>%
  mutate(mean_mpg = map_dbl(.data[["data"]], take_mean_mpg))

Аргумент .data[["data"]] для map_dbl() дает ему список data столбец из фрейма данных для итерации, а не весь фрейм данных. Часть аргумента .data не имеет отношения к вашему столбцу с именем «data», это местоимение rlang .data для ссылки на весь ваш фрейм данных. [["data"]] затем извлекает столбец с именем «данные» из вашего фрейма данных. Вы используете mutate, потому что пытаетесь (я предположил, возможно, неправильно) добавить столбец со средними значениями во вложенный фрейм данных. mutate() используется для добавления столбцов, поэтому вы добавляете столбец, равный выходному результату map() (или map_dbl()) с вашей функцией, которая вернет список (или вектор) средних значений.

Это может сбить меня с толку. Хотя map() часто используется для перебора строк фрейма данных, технически он перебирает список (см. документацию , где под аргументами написано:

.x Список или атоми c вектор.

Он также возвращает список или вектор. Хорошая новость в том, что столбцы - это просто списки значений, поэтому вы передаете его список (столбец), который вы хотите перебирать, и назначить его списку (столбцу), где вы хотите его сохранить (это присвоение происходит с mutate()).

1 голос
/ 16 июня 2020

Вы должны передать mtcars_nested$data в map и взять среднее значение mpg столбца.

take_mean_mpg <- function(df){
     mean(df$mpg)
}

purrr::map(mtcars_nested$data, take_mean_mpg)
#[[1]]
#[1] 24.39231

#[[2]]
#[1] 17.14737
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...