【问题标题】:Replace word by matching to another data frame通过匹配另一个数据框来替换单词
【发布时间】:2016-05-30 16:15:10
【问题描述】:

我一直在寻找解决此问题的现有解决方案 - 没有任何运气!

任何帮助表示赞赏。

数据

long.name <- c("REPUBLIC OF BELARUS", "REPUBLIC OF VIETNAM"
, "GOVERNMENT OF JAMAICA", "LEBANESE REPLUBLIC")

result <- c(256, 578, 467, 698)

df1 <- data.frame(long.name, result)

country <- c("BELARUS", "VIETNAM", "JAMAICA", "LEBANESE")

country.code <- c("BLR", "VNM", "JAM", "LBN")

df2 <- data.frame(country, country.code)

问题

我希望用对应的代码df2$country.code替换国家名称的长版本 df1$long.name

即最终结果将如下所示:

df1$final.aim <- c("REPUBLIC OF BLR", "REPUBLIC OF VNM", 
"GOVERNMENT OF JAM", "LBN REPLUBLIC")

【问题讨论】:

    标签: r replace gsub


    【解决方案1】:

    stringr 的一个选项,

    library(stringr)
    #pattern
    ptrn1 <- str_extract(df1$long.name, paste(df2$country, collapse='|'))
    #replacement
    rpl <- df2$country.code[match(df2$country, ptrn1)]
    
    df1$long.name <- str_replace_all(df1$long.name, ptrn1, rpl)
    df1
    #          long.name result
    #1   REPUBLIC OF BLR    256
    #2   REPUBLIC OF VNM    578
    #3 GOVERNMENT OF JAM    467
    #4     LBN REPLUBLIC    698
    

    【讨论】:

      【解决方案2】:

      首先,我建议将因子long.name 列转换为字符。这使得一些字符串操作更容易;特别是,它允许在列中增量替换值,而不必担心因子水平。或者,由于您想在新列 final.aim 中构建最终结果,您可以将 long.name 列的字符串化副本分配给新列,然后处理该列

      我的解决方案使用 for 循环一次迭代一个替换候选者,IOW 一次迭代一行 df2。对于每一行,它围绕目标单词构造一个正则表达式(我假设您只想匹配整个单词,因此\b 单词边界断言的定界)。然后,它会查找与模式匹配的长名称,并使用国家/地区代码替换所有这些名称中的目标词,再次取自 df2,使用对 sub() 的调用。

      df1$final.aim <- as.character(df1$long.name);
      for (sri in seq_len(nrow(df2))) {
          pat <- paste0('\\b',df2$country[sri],'\\b');
          lris <- grep(pat,df1$final.aim);
          df1$final.aim[lris] <- sub(pat,df2$country.code[sri],df1$final.aim[lris]);
      };
      df1;
      ##               long.name result         final.aim
      ## 1   REPUBLIC OF BELARUS    256   REPUBLIC OF BLR
      ## 2   REPUBLIC OF VIETNAM    578   REPUBLIC OF VNM
      ## 3 GOVERNMENT OF JAMAICA    467 GOVERNMENT OF JAM
      ## 4    LEBANESE REPLUBLIC    698     LBN REPLUBLIC
      

      【讨论】:

      • 感谢您的帮助。不久前我在我的数据上进行了这项工作,但现在我面临 grep(pat, ...) 中的错误:正则表达式在此语言环境中无效。你有什么想法可以解决这个问题吗?
      • 嗯,我以前从未见过这个错误。 df2$country 中的元字符或特殊字符可能存在问题。如果您可以发布您的完整数据集,我可以看看它。这将有助于准确追踪是哪个字符串触发了错误。
      • 也很高兴知道您的 R 会话设置了什么语言环境。您可以运行Sys.getlocale() 来查看此内容。
      • 我不知道 - 我在工作中运行它并且运行顺利。此语言环境中的 FYI 错误:“en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8”我明天会回来告诉你我在工作中使用的语言环境。谢谢
      • Sys.getlocale() #在工作 [1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom。 1252"
      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 2021-05-19
      • 2017-01-05
      • 1970-01-01
      相关资源
      最近更新 更多