#r #tidyverse #tidyeval #fuzzyjoin
#r #tidyverse #tidyeval #fuzzyjoin
Вопрос:
Я получаю сообщение об ошибке в консоли:
Ошибка :=
({ : не удалось найти функцию «:=»
Я использую только пакеты fuzzyjoin (автор Дэвид Робинсон) и tidyverse. Функция принята без синтаксических ошибок. При выполнении мне выдается ошибка. В чем может быть причина?
df_recode_brand_name <-
tibble(
regex_name = c("wacoal|tempt", "calvin", "hanky", "victoria"),
return_name = c("wacoal", "calvin", "hanky", "victoria"))
df_recode_product_category <-
tibble(
regex_name = c("lingerie", "pant", "bra", "undies"),
return_name = c("lingerie", "pant", "bra", "undies"))
fn_regex_recode <- function(df, df_recode_dic, col_name) {
df %>% regex_left_join(
df_recode_dic,
by = c({{col_name}} := "regex_name"),
ignore_case = T ) %>%
mutate({{col_name}} := if_else(is.na(return_name), str_to_lower({{col_name}}), return_name)) %>%
select(-regex_name, -return_name)
}
df_raw2 <-
df_raw %>%
fn_regex_recode(df_recode_brand_name,brand_name) %>%
fn_regex_recode(df_recode_product_category, product_category)
Вот пример данных
df_raw <-
tibble::tribble(
~brand_name, ~product_category, ~description,
"Calvin Klein", "Women - Lingerie amp; Shapewear - Bras", "Practice bold, fearl",
"Wacoal", "Bras", "Beautiful all over c",
"Victoria's Secret", "Add-2-Cups Push-Up Bra", "The ultimate lift-lo",
"Wacoal", "Women - Lingerie amp; Shapewear - Sexy Lingerie", "With luscious lace a",
"Victoria's Secret", "Incredible by Victoria Sport Bra", "Tackle high-intensit",
"Calvin Klein", "Women - Lingerie amp; Shapewear - Designer Lingerie", "Moderate coverage th",
"Victoria's Secret", "Wicked Unlined Uplift Bra", "A little lift goes a",
"Victoria's Secret", "Crochet Lace Cheekster Panty", "The prettiest croche",
"Victoria's Secret", "Curved-hem Thong Panty", "Seriously sleek and",
"Victoria's Secret", "Add-2-Cups Push-Up Bra", "The ultimate lift-lo",
"Victoria's Secret", "Perfect Coverage Bra", "Our fullest coverage",
"US TOPSHOP", "Lingerie", "Revamp your lingerie",
"Calvin Klein", "Sleepwear", "a modern cotton loun",
"AERIE", "Everyday Loves Undies 7 for $27.50 USD", "Introducing Everyday",
"b.tempt'd by Wacoal", "Women - Lingerie amp; Shapewear - Designer Lingerie", "Sheer and sexy, the",
"Wacoal", "Women - Lingerie amp; Shapewear - Bras", "Discover the glove-l",
"Victoria's Secret Pink", "Wear Everywhere Push-Up Bra", "An everyday fave wit",
"WACOAL", "PANTIES", "A sheer lace panty t",
"Victoria's Secret", "Add-1?-Cups Push-Up Bra", "This push-up gives y",
"Wacoal", "Bras", "Sport bra offers gre"
)
Комментарии:
1.
:=
Оператор fromdata.table
, nottidyverse
.2. Нет, он также используется пакетами tidyverse
3. Я считаю, что подстановка работает правильно, но тогда у вас все еще остается a
:=
в вашемc()
вызове, что вызывает проблему. Может быть, если вы используете функцию tidyverse, например,vctrs::vec_c()
она будет работать. Еще попробуйте ответ Ронака, где вы должны иметь возможность использовать {{}} вместо substitute .
Ответ №1:
Попробуйте использовать setNames
in by
для передачи именованного вектора.
library(dplyr)
library(fuzzyjoin)
library(rlang)
fn_regex_recode <- function(df, df_recode_dic, col_name) {
val <- deparse(substitute(col_name))
df %>%
regex_left_join(
df_recode_dic,
by = setNames('regex_name', val),ignore_case = TRUE) %>%
mutate({{col_name}} := if_else(is.na(return_name), str_to_lower({{col_name}}), return_name)) %>%
select(-regex_name, -return_name)
}
Комментарии:
1. Он выдает синтаксическую ошибку Error: unexpected ‘}’ в: » select(-regex_name, -return_name) }»
2. Можете ли вы привести пример
df_raw
?3. Спасибо за помощь. Я прикрепил образец данных к вопросу.
4. Кстати, я вижу, что проблема только с regex_left_join, но не с dplyr::mutate
5.
deparse(substitute()
не является надежным, он может возвращать вектор длины> 1.as_label(substitute(arg))
илиas_string(ensym(arg))
у вас нет этой проблемы.