【问题标题】:How to use `dplyr::filter` inside `purrr::map`如何在`purrr::map`中使用`dplyr::filter`
【发布时间】:2021-02-18 15:38:00
【问题描述】:

这是一个非常简单的函数,它在使用map时返回一个列表

library(tidyverse)


simple_function <- function(x,y){
 c(x+y, y-x)
}


1:3 %>% 
  map2(5,simple_function)
#> [[1]]
#> [1] 6 4
#> 
#> [[2]]
#> [1] 7 3
#> 
#> [[3]]
#> [1] 8 2

我想创建一个类似的函数,它可以根据关键字进行过滤并返回一个向量。所以这是我做的



df <- structure(list(to_filter = c("YY", "XX", "XX", "YY", "XX", "XX", 
                                 "YY", "YY", "YY", "YY", "ZZ", "YY", "ZZ", "YY", "YY", "XX", "YY", 
                                 "YY", "YY", "YY"), num = c(1L, 2L, 2L, 4L, 2L, 3L, 3L, 5L, 3L, 
                                                            1L, 4L, 5L, 1L, 2L, 5L, 1L, 1L, 3L, 5L, 5L)), row.names = c(NA, 
                                                                                                                        -20L), class = c("tbl_df", "tbl", "data.frame"))

filter_func <- function(name, dff){
  dff %>% 
    filter(to_filter == name) %>% 
    pull(num)
}

如您所见,当我单独使用该功能时,它可以正常工作

filter_func("YY", df)
#>  [1] 1 4 3 5 3 1 5 2 5 1 3 5 5

但是当我在 map 中使用它时,它不起作用


df %>% 
  pull(to_filter) %>% 
  unique() %>% 
  map2(df, filter_func)
#> Error: Mapped vectors must have consistent lengths:
#> * `.x` has length 3
#> * `.y` has length 2

我知道我在这里犯了一个非常基本的错误,但不知道是什么。

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    我不明白你为什么需要map2(),它需要两个列表。您可以使用map() 运行它。 也就是说,您确实需要指定 fliter_func() 的 dff 值。

    df %>% 
        pull(to_filter) %>% 
        unique() %>% 
        map(.f = filter_func, dff = df)
    
    [[1]]
     [1] 1 4 3 5 3 1 5 2 5 1 3 5 5
    
    [[2]]
    [1] 2 2 2 3 1
    
    [[3]]
    [1] 4 1
    

    【讨论】:

    • 是的,我应该像这样在函数map(filter_func, df) 之后调用df。这是我的一个愚蠢的错误。
    【解决方案2】:

    您需要 map 进行适当的函数调用,而不是 map_2

    df %>% 
      pull(to_filter) %>% 
      unique() %>% 
      map(., .f = function(x) { filter_func(name = x, dff = df) })
    

    输出

    [[1]]
     [1] 1 4 3 5 3 1 5 2 5 1 3 5 5
    
    [[2]]
    [1] 2 2 2 3 1
    
    [[3]]
    [1] 4 1
    

    【讨论】:

    • 有什么理由在函数内部调用函数,我从来没见过map这样用过。
    • 我不知道如何映射参数 - 请参考 Nicolas 的回答。肯定更好。
    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多