使用str_detect(或其他函数)和某种循环列表的方式来执行vlookup

使用str_detect(或其他函数)和某种循环列表的方式来执行vlookup,r,stringr,R,Stringr,我一直在寻找一种方法来做到这一点,这里的一些结果似乎相似,似乎没有任何效果,我也找不到一种方法,可以像excel中的vlookup一样在列表中循环。如果我错过了,我道歉 我正在尝试使用Mutate向数据集添加一个新列。它将要做的是使用str_replace(或者其他一些函数,如果必要的话)查看一列,然后循环浏览另一个列表。我想用另一列中的相应值替换它在上找到的内容。本质上是excel中的vlookup。但是,无法在excel中执行此操作,因为文件太大 我可以一次做一个简单的str_替换一个,但是

我一直在寻找一种方法来做到这一点,这里的一些结果似乎相似,似乎没有任何效果,我也找不到一种方法,可以像excel中的vlookup一样在列表中循环。如果我错过了,我道歉

我正在尝试使用Mutate向数据集添加一个新列。它将要做的是使用str_replace(或者其他一些函数,如果必要的话)查看一列,然后循环浏览另一个列表。我想用另一列中的相应值替换它在上找到的内容。本质上是excel中的vlookup。但是,无法在excel中执行此操作,因为文件太大

我可以一次做一个简单的str_替换一个,但是有502个可能的选项需要选择,因此编写代码需要很长时间。以下是我到目前为止的情况:

 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])
}