dplyr友好的用户函数,用于连接函数

dplyr友好的用户函数,用于连接函数,r,function,dplyr,R,Function,Dplyr,我所做的工作涉及在一个键查找变量上合并来自不同来源的多个数据库。该变量是一个字符串变量,通常根据数据源(即“纽约市”、“纽约市”)以多种不同的方式拼写 我编写了一个简单的函数来清理每个数据集中的查找变量,并以如下方式使用它: clean.names <- function(x){ x %>% str_remove_all('[:punct:]') %>% str_to_lower() %>% str_squish() %>%

我所做的工作涉及在一个键查找变量上合并来自不同来源的多个数据库。该变量是一个字符串变量,通常根据数据源(即“纽约市”、“纽约市”)以多种不同的方式拼写

我编写了一个简单的函数来清理每个数据集中的查找变量,并以如下方式使用它:

clean.names <- function(x){
  x %>% 
    str_remove_all('[:punct:]') %>% 
    str_to_lower() %>% 
    str_squish() %>% 
    str_trim()
}

#df_1 and df_2 are dataframes, with variables key that I use to merge. 
df_1 %>% 
  mutate(clean_name = clean.names(key1)) %>% 
  left_join(df_2 %>% 
              mutate(clean_name = clean.names(key2)), 
            by = 'clean_name')
clean.names%
str_remove_all('[:punct:')%>%
str_至_下部()%>%
str_squish()%>%
str_trim()
}
#df_1和df_2是数据帧,带有用于合并的关键变量。
df_1%>%
变异(clean_name=clean.names(key1))%>%
左联合(df_2%>%
mutate(clean_name=clean.names(key2)),
by='clean_name')
此函数在实现其预期用途时运行良好。但是,代码有点冗长。我的问题是:如何创建一个与dplyr(即,无引号等)一起工作的函数,以产生与上面相同的效果?我希望它是真正的dplyr形式,并在连接函数中充当包装器。我尝试过这一点,但没有成功,请参见:

clean.names <- function(x =df, y = merge.vary){ # function adds
  x$merge.vary <- y %>%                         # a new variable
    str_remove_all('[:punct:]') %>%             # to existing dataframe
    str_to_lower() %>% 
    str_squish() %>% 
    str_trim()
}


clean.names(df_1, key1) %>%         # then use the function as a wrapper
  left_join(clean.names(df_2, key2))# for the dplyr join functions 
clean.names%#到现有数据帧
str_至_下部()%>%
str_squish()%>%
str_trim()
}
clean.names(dfu 1,key1)%>%#然后将函数用作包装器
dplyr连接函数的左连接(clean.names(df_2,key2))#

有办法做到这一点吗?我想要的是一个类似dplyr的代理函数,看起来像:function(数据帧,变量)。谢谢。

您可以使用
rlang::ensym()
捕获变量名,并将其直接传递给
mutate\u at

library(tidyverse)
clean.names2 <- function( .df, .var ) {
  f <- compose( partial(str_remove_all, pattern='[:punct:]'), 
                 str_to_lower, str_squish, str_trim )
  .df %>% mutate_at( vars(!!ensym(.var)), f )
}

第二种机制属于处理的函数类,允许程序员直接处理未赋值的表达式,包括函数用户提供的表达式。特别是,我们使用
ensym
捕获调用环境提供给函数的符号,并将该符号传递给
vars
很重要,因为它告诉
vars
继续计算表达式
ensym(.var)
,并将结果用作列名。没有
vars
将试图找到一个名为“ensym(.var)”的列。

也许值得探索:谢谢,我研究了这个问题,但不太清楚如何将内容连接起来。我再看一看,“如何创建一个与dplyr一起工作的函数”-任何将数据帧作为第一个参数并返回数据帧的函数都可以与
dplyr
一起工作。“(即,没有引用,等等。)”这更难。这是一个很好的开始。谢谢,这很有效!你介意解释一下这里发生了什么吗?我发现这个链接有助于理解砰砰
符号:
X <- tibble( Cities = c("  New York City, NY", "Denver, CO;;") )
clean.names2( X, Cities )
# # A tibble: 2 x 1
#   Cities          
#   <chr>           
# 1 new york city ny
# 2 denver co       

clean.names2( X, "Cities" )  ## equivalent
mydf %>% mutate_at( vars("mycolumn"), myfunction )  # vars can be dropped here
mydf %>% mutate_at( vars(mycolumn), myfunction )