【发布时间】:2020-11-10 06:09:13
【问题描述】:
我想创建一个自定义函数来尝试标准化多个不同列、多个不同数据框中的字符串,最终目的是将它们中的数据连接在一起。
为了做到这一点,我希望能够将列名传递给自定义函数,并让该函数对该列执行操作。在下面的示例中,我想在将列 a 和 c 连接在一起之前清理它们,使其看起来像这样:
library(tidyverse)
df1 <- tibble(a = c("apple & pear", "kiwi", "plum"), b = c("cat", "dog", "cow"))
df2 <- tibble(c = c("apple and pear", "kiwi.", "plum"), d = c("car", "bike", "truck"))
full_join(df1, df2, by = c("a" = "c") )
a b d
1 apple & pear cat car
2 kiwi dog bike
3 plum cow truck
而不是现在的结果,是这样的:
# A tibble: 5 x 3
a b d
1 apple & pear cat NA
2 kiwi dog NA
3 plum cow truck
4 apple and pear NA car
5 kiwi. NA bike
为此,我知道我需要构建自定义函数,但我相对缺乏经验,尤其是使用curly-curly。下面的两个函数应该更改符号并删除尾随标点符号,理想情况下应该将它们组合成一个函数,如果需要,可以灵活地添加更多函数,如下所示:
add_symbol <- function(col.name){
mutate({{col.name}} = gsub(" & ", " and ", {{col.name}}))
}
rm_trail_punc <- function(col.name){
mutate({{col.name}} = gsub("[[:punct:]]$", "", {{col.name}}))
}
standardise_col <- function(df, col.name){
df %>%
add_symbol({{col.name}}) %>%
rm_trail_punc({{col.name}})
}
df1 <- standardise_col(df1)
standardise_col(df2) %>%
full_join(., df1, by = c("a" = "c"))
但是,这些函数无法创建,并返回错误unexpected '=',因为无法将列名传递到等号的左侧。有什么方法可以将这些值传递给mutate 而无需对其进行硬编码?
【问题讨论】:
-
请提供更好的样本数据,你有 df1 & df2,然后加入后你的数据集中突然有 Cat、Cow 和 dog,而 df2 无处出现
-
抱歉,在原始代码中进行了更改,但未在此处正确发布内容。现在更新了