【问题标题】:How to reference a column in a nested dataframe (then use purrr::map)如何引用嵌套数据框中的列(然后使用 purrr::map)
【发布时间】:2020-06-16 12:24:29
【问题描述】:

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

对于一个可重现的示例,我将 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::mapam 的每个级别取mpg 的平均值

我想知道为什么这不起作用:


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】:

    数据框(和 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))
    

    map_dbl().data[["data"]] 参数为它提供了来自您的数据框的 data 列表列以进行迭代,而不是整个数据框。参数的.data 部分与您名为“data”的列无关,它是rlang pronoun .data 引用您的整个数据框。 [["data"]] 然后从您的数据框中检索名为“数据”的列。您使用 mutate 是因为您正在尝试(我假设,可能是错误的)将具有平均值的列添加到嵌套数据框中。 mutate() 用于添加列,因此您使用函数添加等于 map()(或 map_dbl())输出的列,这将返回平均值列表(或向量)。

    这可能是一个令人困惑的概念。虽然map() 经常用于迭代数据帧的行,但它在技术上迭代列表(参见documentation,在它的参数下:

    .x 一个列表或原子向量。

    它还返回一个列表或一个向量。好消息是列只是值的列表,因此您将希望它迭代的列表(列)传递给它,并将其分配给您希望存储它的列表(列)(此分配发生在mutate()) .

    【讨论】:

    • 您对我的代码为什么不起作用的解释非常有帮助。是 mutate 还是 map_dbl 阻止 map 遍历列而不是行?或者您的解决方案中是什么使map 遍历行?谢谢。
    • @JeremyK。好问题,我已经更新了我的答案以提供更清晰的答案。简而言之,您通过将“数据”列作为.x 参数传递给map() 来迭代行,而不是将整个数据框作为参数传递。
    • 对于任何试图解决类似问题的人,我真的建议阅读@wil 提供的rlang pronoun .data 链接和map 文档。 @wil 谢谢你这么有耐心;我现在终于明白了。
    【解决方案2】:

    您应该在map 中传递mtcars_nested$data 并取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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2021-01-17
      相关资源
      最近更新 更多