使用str_detect(或其他函数)和某种循环列表的方式来执行vlookup
我一直在寻找一种方法来做到这一点,这里的一些结果似乎相似,似乎没有任何效果,我也找不到一种方法,可以像excel中的vlookup一样在列表中循环。如果我错过了,我道歉 我正在尝试使用Mutate向数据集添加一个新列。它将要做的是使用str_replace(或者其他一些函数,如果必要的话)查看一列,然后循环浏览另一个列表。我想用另一列中的相应值替换它在上找到的内容。本质上是excel中的vlookup。但是,无法在excel中执行此操作,因为文件太大 我可以一次做一个简单的str_替换一个,但是有502个可能的选项需要选择,因此编写代码需要很长时间。以下是我到目前为止的情况:使用str_detect(或其他函数)和某种循环列表的方式来执行vlookup,r,stringr,R,Stringr,我一直在寻找一种方法来做到这一点,这里的一些结果似乎相似,似乎没有任何效果,我也找不到一种方法,可以像excel中的vlookup一样在列表中循环。如果我错过了,我道歉 我正在尝试使用Mutate向数据集添加一个新列。它将要做的是使用str_replace(或者其他一些函数,如果必要的话)查看一列,然后循环浏览另一个列表。我想用另一列中的相应值替换它在上找到的内容。本质上是excel中的vlookup。但是,无法在excel中执行此操作,因为文件太大 我可以一次做一个简单的str_替换一个,但是
testVendor <- vendorData %>%
select(TOUPPER(Addr1) %>%
mutate('NewAdd' = str_replace(Addr1, 'STREET', 'ST'))
testVendor%
选择(TOUPPER(Addr1)%>%
mutate('NewAdd'=str_replace(Addr1,'STREET','ST'))
但是,我不想指定STREET,然后指定ST,而是希望它循环遍历常见邮政缩写的列表,并返回标准缩写
例如
addr1 <- c('123 MAIN STREET', '123 GARDEN ROAD', '123 CHARLESTON BOULEVARD')
state_abbrv <- c('FL', 'CA', 'NY')
vendor <- data.frame(addr1, state_abbrv)
usps_name <- c('STREET', 'LANE', 'BOULEVARD', 'ROAD', 'TURNPIKE')
usps_abbrv <- c('ST', 'LN', 'BLVD', 'RD', 'TPKE')
usps <- data.frame(usps_name, usps_abbrv)
addr1这可能是我写过的最令人困惑的r代码之一,但它解决了这个问题
library(tidyverse)
df_phrases <- tribble(~phrases,
"testing this street for pests",
"this street better be lit")
df_lookup <- tribble(~word,~replacement,
"street","st",
"pests","rats",
"lit","well iluminated")
lookup_function <- function(phrase,df_lookup){
wordss <- phrase %>%
str_split(" ")
table_to_join <- tibble(word = wordss) %>% unnest()
table_to_join %>%
left_join(df_lookup) %>%
mutate(new_vector = if_else(replacement %>% is.na,
word,
replacement)) %>%
pull(new_vector) %>%
str_flatten(collapse = " ")
# words_to_replace <- map(wordss,function(x) x %in% c(df_lookup$word))
# tibble(wordss,words_to_replace) %>%
# unnest()
}
df_phrases%>%
mutate(test = phrases %>% map_chr(lookup_function,df_lookup))
库(tidyverse)
df_短语%is.na,
单词
替换%>%
拉动(新_矢量)%>%
str_展平(collapse=“”)
#文字\u至\u替换%
#unnest()
}
df_词组%>%
变异(测试=短语%>%map\u chr(查找函数,df\u查找))
我会使用for循环:
usps[] = lapply(usps, as.character)
vendor$new_addr1 = as.character(vendor$addr1)
for(i in 1:nrow(usps)) {
vendor$new_addr1 = str_replace_all(
vendor$new_addr1,
pattern = usps$usps_name[i],
replacement = usps$usps_abbrv[i])
}
vendor
# addr1 state_abbrv new_addr1
# 1 123 MAIN STREET FL 123 MAIN ST
# 2 123 GARDEN ROAD CA 123 GARDEN RD
# 3 123 CHARLESTON BOULEVARD NY 123 CHARLESTON BLVD
为了更加安全,我将向您的模式中添加regex单词边界,如下所示,以便只替换整个单词。(我假设您希望将飞机RD更改为飞机RD,而不是飞机LN RD)
请添加几行示例数据并显示预期输出。添加示例数据的最好方法是使其可复制/粘贴dput()
对此很有帮助,例如,dput(droplevels(您的_数据[1:5,]))
我想您可以创建一个包含替换词和原始词的表,创建一个用词返回答案的函数,将此函数应用于所有短语,它可能在性能方面也很糟糕,但实际上您可以使此操作瘫痪,因为一个表只有通用名称和USPS定义的通用名称缩写。另一个表有完整的地址。我想做的是将街道替换为圣街。如果合并将有助于解决vlookup类型的情况,那么请说明将如何进行。基本上,它会到达第一行,说ok,它包含street,让我们在另一个表中循环,直到找到street。然后,它将在下一列中给出项目,而不是单词street。然后它将移动到第2行并重复相同的过程。我希望这有帮助。这绝对有效!我想在“模式”行的末尾需要一个逗号。试图进行编辑,但由于它不是6个字符长,它不允许我。好极了
for(i in 1:nrow(usps)) {
vendor$new_addr1 = str_replace_all(
vendor$new_addr1,
pattern = paste0("\\b", usps$usps_name[i], "\\b"),
replacement = usps$usps_abbrv[i])
}