r - 匹配查找表 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() ?
解决方案
使用数据表:
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)
}
推荐阅读
- numpy - 使用 Tensorflow、Keras、Numpy 的多元线性回归
- php - 如果没有上传文件,如何编写 php 逻辑
- xamarin - 如何在 Xamarin.Forms Android 中以编程方式从 Light Mode 更改为 Dark Mode 和/或以编程方式更改滚动条的颜色?
- reactjs - React - 循环遍历一个充满包含对象的数组的对象
- java - Jersey2 遵循什么?Servlet-2 或 Servlet-3 规范
- python - 为什么 Scipy 如此糟糕地拟合这条曲线?
- setuptools - 如何在 PyPI 中设置项目链接
- java - 方法中变量的可见性
- typescript - Angular 拦截器,处理 HTTP 错误并重试
- python - 发生 SMTP 验证错误。如何解决?