【问题标题】:Writing a generic function for "find and replace" in R在 R 中为“查找和替换”编写通用函数
【发布时间】:2012-10-10 22:18:21
【问题描述】:

我需要为“在 R 中查找和替换”编写一个通用函数。如何编写一个接受以下输入的函数

  • CSV 文件(或数据框)
  • 要查找的字符串,例如“name@email.com”
  • 用字符串替换找到的字符串,例如“medium”

并重写 CSV 文件/数据框,以便将所有找到的字符串替换为替换字符串?

【问题讨论】:

  • 你试过什么?它是确切的字符串还是部分匹配?例如是否将“电子邮件为 name@email.com”替换为“电子邮件为中等”?你必须在R中这样做吗?命令行工具sed 是我能想到的最好的方法。

标签: r data-manipulation


【解决方案1】:

这里有一个快速的函数来完成这项工作:

library(stringr)

replace_all <- function(df, pattern, replacement) {
  char <- vapply(df, function(x) is.factor(x) || is.character(x), logical(1))
  df[char] <- lapply(df[char], str_replace_all, pattern, replacement)  
  df
}

replace_all(iris, "setosa", "barbosa")

基本上,它会识别数据框中所有作为字符或因子的变量,然后将str_replace_all 应用于每一列。 Pattern应该是一个正则表达式,但是如果你想匹配一个固定的字符串,你可以这样做(例如)

replace_all(iris, fixed("setosa"), "barbosa")

【讨论】:

    【解决方案2】:

    以下解决方案适用于“精确”匹配:

    dat <- data.frame(a=letters[1:10], y=letters[10:1]) 
    apply(dat, 2, function(v, foo, bar) {v[v==foo]=bar;return(v)}, foo='a', bar='baz')
    

    但是,这不会替换包含 1 的字符串。它还会有许多边缘情况,无法按您预期的方式工作。

    正如我在评论中提到的,命令行工具sed 非常适合这种操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多