将pmap列表参数应用于嵌套在另一个函数中的函数

3
我需要使用 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
1个回答

2

这里有一个选项。请注意,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
@Diego 我的意思是使用.[-1]来选择除第一个元素以外的所有元素(如果有多列的话)。这里需要使用花括号,因为我们正在进行一些操作以提取组件。 - akrun
谢谢...还有一件事,这里的“first”是一个内置函数的名称,而不是我的变量名称...对吗? - Diego
1
@Diego 是的,这里的 first 是函数。(任何带有 () 的东西)我应该提到它。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接