【问题标题】:R replace part of a string conditionally by a vector of possible replacementsR用可能的替换向量有条件地替换字符串的一部分
【发布时间】:2016-06-02 07:39:28
【问题描述】:

假设 R 中有一个数据框,其中我有(除其他外)以下列:

V1
Q1r2c5
Q1r5c11
Q1r5_1c130

我有第二个数据框,如下所示:

search    replace
5         brand1
11        brand2
130       brand3

我想要做的是:在第一个数据帧中搜索 V1 中“c”后面的部分,并将其替换为第二个数据帧中的匹配替换。因此:

  1. Q1r2c5 变为“brand1”
  2. Q1r5c11 变为“brand2”
  3. Q1r5_1c130 变为“brand3”

我已经尝试过gsub(".*c", "", dataframe$V1"),它确实给了我“c”后面的部分。但是,我还没有找到一种简单的方法(通过 for 循环除外)来根据第二个数据帧进行匹配。

有什么想法吗? 非常感谢!

【问题讨论】:

  • 尝试函数match(根据您通过sub调用检索的部分进行匹配)
  • 只是一个建议,但如果您的第一列仅包含“Q1r2c5”、“Q1r5c11”和“Q1r5_1c130”,请确保此列是一个因素,然后您可以相应地替换级别。比如:levels(df$V1) <- c("brand1", "brand2", "brand3")
  • @PlasmaBinturong:不幸的是,“c”之前的部分包含 28 个不同的字符串,“c”后面的部分包含 15 个。所以我最终会得到 420 个因子级别。

标签: r regex replace gsub


【解决方案1】:

您可以使用match 来生成替换。在下面的示例中,我向第一个数据框添加了一个数据,以进行检查。

V1 <- read.table(text="Q1r2c5
                 Q1r5c11
                 Q1r5_1c130
                 testc130", stringsAsFactors=F)
V2 <- read.table(text = "search    replace
                 5         brand1
                 11        brand2
                 130       brand3", header = T, stringsAsFactors=F)

V2$replace[match(sub(".*c", "", V1$V1), V2$search)]
[1] "brand1" "brand2" "brand3" "brand3"

【讨论】:

  • 就是这样。不错的解决方案,似乎相当于 Excels 的 vlookup 函数。
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 2018-12-18
  • 2020-07-28
  • 2021-03-01
  • 2021-10-19
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
相关资源
最近更新 更多