【问题标题】:R replace string-matching in dataframe with value from another dataframe with gsubR用gsub从另一个数据帧中的值替换数据帧中的字符串匹配
【发布时间】:2016-12-10 09:49:38
【问题描述】:
text = c("Hello abc01","Go to abc02")
value = c(0,1)
symbol=c("abc01","abc02")
df1 = data.frame(text)
df2 = data.frame(symbol,value)

我想将df1中作为文本包含的符号替换为df2中对应的值,得到:'Hello 0', 'Go to 1'

对于字符串替换,我通常使用 gsub(pattern, replacement, x)

例如:如果我想用“OK”替换“abc01”和“abc02”:

df1 = apply(df1,2,function(x) gsub("abc[0-9]{2}","OK",x))

我的想法是在替换部分使用一个函数:

gsub(df1,2,function(x) gsub("(abc)", Support(KKK),x)

我将在其中进行替换,但我不知道如何将 KKK 作为参数传递,匹配字符串已确定(abc01,abc02)。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请查看link1link2 并相应地修改您的问题。
  • 可以试试library(gsubfn) ; gsubfn("abc0(\\d)", ~ as.integer(x) - 1, text)
  • @DavidArenburg 不错。在那种情况下,也许是stri_replace_all_fixed(text, df2$symbol, df2$value, vectorize_all = FALSE)
  • @Jota,是的,我猜这将是理想的解决方案。也不需要使用data.frame。只需stringi::stri_replace_all_fixed(text, symbol, value, vectorize_all = FALSE)。你可以发布那个。
  • @DavidArenburg 谢谢大家的帮助。这是一个简单的例子,但在我的研究中,我需要将所有内容都保存在数据框中。我的解决方案:(library(gsubfn) ; f = function(x) {return (subset(df2,subset=(symbol==x),select=value))} ; df1 = apply(df1,2,function(x) gsubfn("abc[0-9]{2}", f, x))

标签: r dataframe string-matching gsub


【解决方案1】:

这是一个想法(不像 cmets 中的那样巧妙)。这是做什么的,它基本上用匹配的df2$symboldf2$value替换df1$text的最后一个字

sapply(df1$text, function(i) 
       gsub(paste(df2$symbol, collapse = '|'), 
                df2$value[match(sub('^.* ([[:alnum:]]+)$', '\\1', i), df2$symbol)], i))

#[1] "Hello 0" "Go to 1" 

附:我从here借了sub('^.* ([[:alnum:]]+)$', '\\1', i)

【讨论】:

    【解决方案2】:
    df1[["text"]] <- stri_replace_all_fixed(text, symbol, value, vectorize_all = FALSE)
    

    感谢 Jota 的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2021-11-21
      • 2021-08-02
      • 2021-03-21
      • 1970-01-01
      • 2016-07-24
      相关资源
      最近更新 更多