如何在嵌套数据框中引用列(然后使用purrr :: map)

问题描述 投票:0回答:1

关于引用嵌套数据框中的数据列,我有一个非常简单的问题。

对于可重现的示例,我将变量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::mapmpg的每个级别的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
r dplyr tidyverse purrr
1个回答
1
投票

您应该在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

0
投票

数据帧(和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))
© www.soinside.com 2019 - 2024. All rights reserved.