2012-04-11 97 views
-1

必須是避免在R中執行此操作的一種方法。某種映射函數?基本上,要指定一系列grepl條件和一系列替換。謝謝,R映射等效?

hold[grepl('TRAVEL', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "TRAVEL" 
hold[grepl('IN-KIND:', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "IN-KIND" 
hold[grepl('COMPLIANCE', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "COMPLIANCE" 
hold[grepl('MEDIA', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "MEDIA" 
hold[grepl('WATER|FOOD|OFFICE|Office|CLEANING|ALARM', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "OFFICE" 
hold[grepl('DATA', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "DATA" 
hold[grepl('LEGAL', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "LEGAL" 
hold[grepl('EVENT', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "EVENT" 
hold[grepl('CATERING', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "CATERING" 
hold[grepl('PHONE', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "PHONE" 
hold[grepl('EQUIPMENT', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "EQUIPMENT" 
hold[grepl('FUNDRAISING|FINANCE', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "FUNDRAISING" 
hold[grepl('PAYROLL', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "PAYROLL" 
hold[grepl('LIST RENTAL', hold[, "exp_pur_desc"]), "exp_pur_desc"] <- "LIST RENTAL" 

編輯:是啊,對不起,有點輕浮。 hold是data.frame,其中一列名爲「exp_pur_desc」。我可以看到lapply或sapply與「開關」等效。謝謝。

+1

我猜你想要'do.call'和/或'lapply',但是你的代碼不可重現,所以它仍然是一個猜測,因爲我們不知道什麼是持有。 – 2012-04-11 20:11:16

+0

爲什麼不建立玩具來源和目標數據集只有幾個這樣的列。那麼你應該說什麼是正確的答案。 – 2012-04-11 20:35:46

+0

看起來你正在用'TRAVEL'等替換'TRAVEL'等許多似乎多餘的行 - 或者我錯過了什麼? – Tommy 2012-04-11 21:16:17

回答

1

這裏有一種方法:

strReplace <- function(x, mapFrom, mapTo) { 
    for (i in seq_along(mapFrom)) { 
     x <- gsub(mapFrom[[i]], mapTo[[i]], x) 
    } 
    x 
} 

strReplace(c("Hello cruel world!", "Hello again Tellus!"), # Text 
      c("Hello", "world|Tellus"), # words to replace (regular expressions) 
      c("Hi", "moon"))   # words to replace with 
#[1] "Hi cruel moon!" "Hi again moon!" 

...所以你的情況:

hold<-data.frame(ID=11:12, exp_pur_desc=c('FOOD','FINANCE')) 
hold[['exp_pur_desc']] <- strReplace(hold[['exp_pur_desc']], 
    c('WATER|FOOD|OFFICE|Office|CLEANING|ALARM', 'FUNDRAISING|FINANCE'), 
    c('OFFICE', 'FUNDRAISING')) 
hold 
+0

+1。另外,由於OP提到了一個「映射」,因此在調用函數之前,將模式和替換放入兩列數據框中會讓我覺得非常優雅。 – flodel 2012-04-12 02:14:30

0

下面是一個使用gsubfn包的選項,這將取代以 「A」 的任何單詞只有「A」,「E」相同,任何帶有「I」,「O」或「U」的都將被替換爲「IOU」,並且任何小寫元音將使用「其他」替換這取代了整個字符串,這似乎是要求的,如果需要別的東西,它可以被修改):

library(gsubfn) 

replacements <- list(A='A', E='E', I='IOU', O='IOU', U='IOU', 'other') 

gsubfn('^.*?(A|E|I|O|U|a|e|i|o|u).*$', replacements, state.name)