【问题标题】:R mapping equivalent?R映射等效?
【发布时间】:2012-04-11 20:06:10
【问题描述】:

必须是一种避免在 R 中这样做的方法。某种映射函数?基本上,想要指定一系列的grepl条件和一系列的替换。谢谢,

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 使用“switch”等效项。谢谢。

【问题讨论】:

  • 我猜你想要 do.call 和/或 lapply 但你的代码不可重现,所以它仍然是一个猜测,因为我们不知道什么是保持。
  • 为什么不用这些列中的几列来构建玩具源和目标数据集。然后你应该说出正确答案是什么。
  • 对于许多看似多余的行,您似乎将 'TRAVEL' 替换为 'TRAVEL' 等 - 还是我遗漏了什么?

标签: regex r


【解决方案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

【讨论】:

  • +1。此外,由于 OP 提到了“地图”,我会发现在调用函数之前将模式和替换放入两列 data.frame 非常优雅。
【解决方案2】:

这是一个使用 gsubfn 包的选项,这将用“A”替换任何带有“A”的单词,“E”也是如此,任何带有“I”,“O”的单词,或“U”将被“IOU”替换,任何小写元音将使用“other”进行替换(这将替换整个字符串,这似乎是所要求的,如果需要其他内容可以修改) :

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2017-06-09
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多