当函数的输入为数据帧名称时,如何使用purrr

当函数的输入为数据帧名称时,如何使用purrr,r,dplyr,functional-programming,purrr,R,Dplyr,Functional Programming,Purrr,我有一个函数,它有三个输入:df name x、df name y和term,函数看起来像: function(df_x, df_y, term) { list_ids <- df_x %>% left_join(df_y, by = c("idx" = "idy")) %>% distinct() %>% pull(variable) another_function(a = list_ids, b = term, other

我有一个函数,它有三个输入:df name x、df name y和term,函数看起来像:

function(df_x, df_y, term) {
list_ids <- df_x %>%
left_join(df_y, by = c("idx" = "idy")) %>%
distinct() %>%
pull(variable) 

another_function(a = list_ids, b = term, other_parameters = T)
 
}
函数(df_x,df_y,term){
列表ID%
左连接(df_y,by=c(“idx”=“idy”))%>%
不同的()%>%
拉力(可变)
另一个函数(a=列表ID,b=术语,其他参数=T)
}
我有一个包含df_x、df_y和术语的tible:

df_x       df_y        term
<chr>      <chr>       <chr>
df_123a    df_123b     term_m                       
df_123a    df_123b     term_n   
df_456a    df_456b     term_m   
df_456a    df_456b     term_n
df_789a    df_789a     term_m
df_789a    df_789b     term_n 
df_x df_y术语
df_123a df_123b术语
df_123a df_123b术语
df_456a df_456b术语
df_456a df_456b术语
df_789a df_789a期限
df_789a df_789b术语

我想使用map函数来运行使用这个tibble元素的函数。但是,df名称存储为字符,函数包含df_x和df_y的左连接。如何实现这一点?

基本方法是使用
eval(parse(text='string'))
使字符串调用对象名。下面是一个示例,该示例使用函数绑定数据帧中由字符串调用的dfs行:

库(tidyverse)
df1[[1]]
#>#tibble:2x2
#>xy
#>    
#>1 a 1
#>2 b 2
由(v1.0.0)于2021年3月24日创建

更新
get()

join\u dfs%
绑定_行(获取(df2_名称))
}

与其编辑我的原始响应,我将保持原样,因为如果我对其进行更改,它基本上是相同的解决方案。

一种基本方法是使用
eval(parse(text='string'))
使字符串调用对象名。下面是一个示例,该示例使用函数绑定数据帧中由字符串调用的dfs行:

库(tidyverse)
df1[[1]]
#>#tibble:2x2
#>xy
#>    
#>1 a 1
#>2 b 2
由(v1.0.0)于2021年3月24日创建

更新
get()

join\u dfs%
绑定_行(获取(df2_名称))
}

与其编辑我的原始响应,我将保持原样,因为如果我对其进行更改,它基本上是相同的解决方案。

您可以使用
pmap
并按名称从环境中检索对象

library(dplyr)

# tibble with information
match_tib <- tibble(df_1 = c("df1", "df2"),
                    df_2 = c("df2", "df1"),
                    temp = 1:2)

# dfs to join
df1 <- tibble(a = 1:2,
              b = 10)
df2 <- tibble(a = 2:3,
              c = 20)

# run pmap
purrr::pmap(match_tib, function(df_1, df_2, temp) {
  df_new <- get(df_1) %>% 
    left_join(get(df_2), by = "a")
  df_new %>% mutate(x = temp)
})
#> [[1]]
#> # A tibble: 2 x 4
#>       a     b     c     x
#>   <int> <dbl> <dbl> <int>
#> 1     1    10    NA     1
#> 2     2    10    20     1


#> [[2]]
#> # A tibble: 2 x 4
#>       a     c     b     x
#>   <int> <dbl> <dbl> <int>
#> 1     2    20    10     2
#> 2     3    20    NA     2
库(dplyr)
#信息密不可分
匹配_tib#A tibble:2 x 4
#>a b c x
#>      
#>110NA 1
#> 2     2    10    20     1
#> [[2]]
#>#A tibble:2 x 4
#>a c b x
#>      
#> 1     2    20    10     2
#>2 3 20 NA 2

您可以使用
pmap
从环境中按名称检索对象

library(dplyr)

# tibble with information
match_tib <- tibble(df_1 = c("df1", "df2"),
                    df_2 = c("df2", "df1"),
                    temp = 1:2)

# dfs to join
df1 <- tibble(a = 1:2,
              b = 10)
df2 <- tibble(a = 2:3,
              c = 20)

# run pmap
purrr::pmap(match_tib, function(df_1, df_2, temp) {
  df_new <- get(df_1) %>% 
    left_join(get(df_2), by = "a")
  df_new %>% mutate(x = temp)
})
#> [[1]]
#> # A tibble: 2 x 4
#>       a     b     c     x
#>   <int> <dbl> <dbl> <int>
#> 1     1    10    NA     1
#> 2     2    10    20     1


#> [[2]]
#> # A tibble: 2 x 4
#>       a     c     b     x
#>   <int> <dbl> <dbl> <int>
#> 1     2    20    10     2
#> 2     3    20    NA     2
库(dplyr)
#信息密不可分
匹配_tib#A tibble:2 x 4
#>a b c x
#>      
#>110NA 1
#> 2     2    10    20     1
#> [[2]]
#>#A tibble:2 x 4
#>a c b x
#>      
#> 1     2    20    10     2
#>2 3 20 NA 2

围绕着数据的名称。我认为,使用
get()
的框架应该可以工作,在这里,您的
map()
调用将如下所示:

purrr::map(
  .x = 1:nrow(my_tibble),
  .f = ~ my_function(df_x = get(my_tibble$df_x[.x]),
                     df_y = get(my_tibble$df_y[.x]),
                     term = my_tibble$term[.x])
)

我认为,使用
get()
包围data.frames的名称应该可以工作,其中
map()
调用将如下所示:

purrr::map(
  .x = 1:nrow(my_tibble),
  .f = ~ my_function(df_x = get(my_tibble$df_x[.x]),
                     df_y = get(my_tibble$df_y[.x]),
                     term = my_tibble$term[.x])
)

我想知道你的tibble中的df_x和df_y的每个元素本身是否是数据帧。目前,它只是数据帧的名称(不是数据帧本身)。我想知道你的tibble中的df_x和df_y的每个元素本身是否是数据帧。目前,它只是数据帧的名称(不是数据帧本身)
get()
是一种通过字符串调用对象的更好方式!
get()
是一种通过字符串调用对象的更好方式!这很好!谢谢这很好!谢谢