【问题标题】:Applying pmap list arguments to a function nested within another function将 pmap 列表参数应用于嵌套在另一个函数中的函数
【发布时间】:2019-09-05 18:28:39
【问题描述】:

我需要在pmap 变体的帮助下执行一些逐行操作,但在将参数列表(即“.l”参数)传递给嵌套在其中的函数时,我不能这样做另一个函数。

我尝试了各种方法,包括传递参数名称和点点语法都无济于事。我需要知道是否有办法做到这一点,因为我需要将其扩展到更复杂的功能。

假设我有以下数据框,并且我想粘贴每行的前两列。我可以使用以下代码轻松做到这一点:

dff <- data_frame(
  first  = c("A", "B"),
  second = c("X", "Y"),
  third  = c("L", "M")
)

df_easy <- dff %>% 
  mutate(joined_upper = pmap_chr(list(first, second), function(...) paste(..., sep = "&")))

df_easy
#> # A tibble: 2 x 4
#>   first second third joined_upper
#>   <chr> <chr>  <chr> <chr>       
#> 1 A     X      L     A&X         
#> 2 B     Y      M     B&Y

但是,如果我想扩展它以便在合并前两个字母之前将它们小写,我的尝试会失败。我想看看能不能得到dff3。

# df_hard <- dff %>% 
#   mutate(joined_smaller = pmap_chr(list(first, second), function(...) paste(tolower(...), sep = "&")))

dff3 <- data.frame(
  first  = c("A", "B"),
  second = c("X", "Y"),
  third  = c("L", "M"),
  joined_smaller = c("a&X", "b&Y")
)

dff3
#>   first second third joined_smaller
#> 1     A      X     L            a&X
#> 2     B      Y     M            b&Y

【问题讨论】:

    标签: r purrr pmap


    【解决方案1】:

    这是一种选择。请注意,pastestr_c 是矢量化的,即

    library(dplyr)
    library(stringr)
    dff %>% 
         mutate(joined_sma = str_c(tolower(first), second, sep="&"))
    

    并假设这只是针对pmap的练习

    library(purrr)    
    dff %>%
       mutate(joined_sma = pmap_chr(list(first, second), ~ c(...) %>% 
                    {str_c(tolower(first(.)), .[-1], sep="&")}
          ))
    # A tibble: 2 x 4
    # first second third joined_sma
    #  <chr> <chr>  <chr> <chr>     
    #1 A     X      L     a&X       
    #2 B     Y      M     b&Y       
    

    另外,由于只有两列,我们可以使用约定 .x.y 来调用它们

    dff %>%
       mutate(joined_sma = pmap_chr(list(first, second), ~     
           str_c(tolower(.x), .y, sep="&")
      ))
    

    注意:在这里,我们使用 str_c 而不是 paste,因为当缺少值 (NA) 时,这可能会产生不同的行为

    【讨论】:

    • 在这部分... {str_c(tolower(first(.)), .[-1], sep="&")}...有必要用大括号吗?你能描述一下 .[-1] 吗?
    • @Diego 我的意思是.[-1] 选择除第一个以外的所有元素(以防有更多列)。这里需要大括号,因为我们在提取组件时做了几个操作
    • 谢谢....这里首先是一个内置函数的名称,而不是我的变量的名称....对吗?
    • @Diego 是的,first 这是函数。 (任何有())我应该提到它
    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多