关于引用嵌套数据框中的数据列,我有一个非常简单的问题。
对于可重现的示例,我将变量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
您应该在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
数据帧(和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))