首页 > 解决方案 > 匹配查找表 df 自定义函数,不能与它发生变异得到“输入问题”

问题描述

我需要一个自定义函数来防止返回多个匹配项,而不是使用连接。在这种情况下,我只是尝试使用 head(1) 获得第一个匹配/行。

一些数据:

example_df <- data.frame(
  url = c('blog/blah', 'blog/?utm_medium=foo', 'blah', 'subscription/apples', 'UK/something'),
  numbs = 1:5
)

lookup_df <- data.frame(
  string = c('subscription', 'UK', 'blog'),
  group = c('subs', 'UK', 'blog2')
)


lookup_func <- function(str, lut) {
# lookup str in lut$string, return just one row/match  
  
  # works with e.g.
  # str = 'blog'
  # lut = lookup_df

  lut %>% filter(str_detect(.[['string']], str)) %>% head(1) %>% pull(group)
}

example_df %>% 
  mutate(blah = lookup_func(url, lookup_df))

给出:

 Error: Problem with `mutate()` input `blah`.
x Problem with `filter()` input `..1`.
x Input `..1` must be of size 3 or 1, not size 5.
ℹ Input `..1` is `str_detect(.[["string"]], str)`.
ℹ Input `blah` is `lookup_func(url, lookup_df)`.

如果我在lut %>% filter(str_detect(.[['string']], str)) %>% head(1) %>% pull(group)根据注释掉的行设置变量 str 和 lut 之后运行它确实返回所需的字符串“blah2”,而不是当我尝试作为函数时。

如何使用我的自定义函数进行 mutate() ?

标签: r

解决方案


使用数据表:

example_df %>% as.data.table %>% .[, blah := lookup_func(url, lookup_df), by=url] %>% print

我也认为你想在第一个表中查找第二个表,反之亦然,所以你的 lookup_func 应该改变:

lookup_func <- function(str, lut) {
  # lookup str in lut$string, return just one row/match  
  
  # works with e.g.
  # str = 'blog'
  # lut = lookup_df
  
  lut %>% filter(str_detect(str, .[['string']])) %>% head(1) %>% pull(group)
}

推荐阅读