R 中的自定义查找函数在 R 中的 dplyr::mutate 中不起作用

Custom lookup function in R not working within dplyr::mutate in R

我正在尝试使用自定义函数,该函数过滤数据框并从 dplyr::mutatedplyr version 0.8.3 中的另一列中提取信息。我收到两种类型的错误。一个具有大数据帧的错误会产生 Error: Result must have length 32, not 1728,另一个在以下示例代码中使用,不会 return 错误消息,而是 return 错误匹配。

查找数据框

lookup.df<-data.frame(to.match=paste(letters[1:7],letters[8:14],sep = ""),
                       match=c("one","two","three","four","five","six","seven"))

lookup.df

  to.match match
1       ah   one
2       bi   two
3       cj three
4       dk  four
5       el  five
6       fm   six
7       gn seven

查找函数

lookup_function<-function(x){
  y<-lookup.df %>% 
    mutate_all(as.character) %>% 
    filter(to.match==x) %>% 
    pull(match)
  y
}

Vectorize(lookup_function)

航站楼运行

运行从终端执行该功能会 return 预期的结果。

> lookup_function("dk")
[1] "four"
> lookup_function("el")
[1] "five"

dplyr::mutate 运行

运行将相同的函数应用于 dplyr::mutate 中的不同数据帧不会 return 预期的结果。

 live.df<-data.frame(to.match=rev(paste(letters[1:7],letters[8:14],sep = "")))

 live.df %>% 
   mutate(live.match=lookup_function(to.match))

  to.match live.match
1       gn       four
2       fm       four
3       el       four
4       dk       four
5       cj       four
6       bi       four
7       ah       four

代码应该,在这个例子中至少,应该return lookup.df 的匹配列,但反过来却相反 returns four 每行。

通过 Sapply 向量

当通过 sapply.

时,该函数似乎确实 return 了适当的结果
c("dk","el") %>% sapply(lookup_function)
    dk     el 
"four" "five" 

我几乎不熟悉此类用途的自定义函数的矢量化,所以我不确定这是否是此错误的根源。

修复此自定义函数以使其return从查找数据帧中获取正确信息的正确方法是什么?

关于将 OP 的函数与 Vectorize 一起使用,该函数将更新为 lookup_function <- Vectorize(lookup_function),然后应用 OP 的 post 中的代码,或者即时执行此操作

library(dplyr)
live.df %>% 
     mutate(live.match=Vectorize(lookup_function)(to.match))
#  to.match live.match
#1       gn      seven
#2       fm        six
#3       el       five
#4       dk       four
#5       cj      three
#6       bi        two
#7       ah        one

但是,它会很低效,因为它会过滤每个匹配项 (filter(to.match==x) ),这是低效的


我们可以使用 left_join

library(dplyr)
live.df %>%
     left_join(lookup.df)

或使用match

live.df %>%
      mutate(match = lookup.df$match[match(to.match, lookup.df$to.match)])

也可用于base R

live.df$match <- with(live.df, lookup.df$match[match(to.match, lookup.df$to.match)])