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()
).