2012-10-10 47 views
0

我需要編寫一個通用函數用於「在R中查找和替換」。如何可以寫一個函數,採用以下輸入在R中編寫「查找和替換」的通用函數

  • CSV文件(或數據幀)
  • 的字符串找到,例如,「[email protected]
  • 的字符串的替換找到字符串,例如「medium」

並重寫了CSV文件/數據框,以便所有找到的字符串都被替換字符串替換?

+0

你嘗試過什麼?這是確切的字符串還是部分匹配?例如我是否將「電子郵件地址爲[email protected]」替換爲「電子郵件地址中等」?你必須在R中執行此操作嗎?命令行工具'sed'是我能想到的最好的東西,可以用來做你正在問的東西。 – Justin

回答

8

這裏有一個快速的功能做的工作:

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到每一列。模式應該是一個正則表達式,但如果你想匹配一個固定的字符串,你可以做(​​例如)

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

該解決方案將在下文爲「精確」匹配工作:

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非常適合這種操作。