【发布时间】:2019-08-04 01:16:16
【问题描述】:
我正在尝试做一些我认为很简单但让我难过的事情。
假设我有以下数据框:
id <- c("bob_geldof", "billy_bragg", "melvin_smith")
code <- c("blah", "di", "blink")
df <- as.data.frame(cbind(id,code))
> df
id code
1 bob_geldof blah
2 billy_bragg di
3 melvin_smith blink
还有一个这样的:
ID1 <- c("bob_geldof", "melvin_smith")
ID2 <- c("the_builder", "kelvin")
alternates <- as.data.frame(cbind(ID1, ID2))
> alternates
ID1 ID2
1 bob_geldof the_builder
2 melvin_smith kelvin
如果df$id 中的字符串匹配alternates$ID1,我想用alternates$ID2 替换它。如果不匹配,我想保持原样。
最终的 df 应该是这样的
> df
id code
1 bob_the_builder blah
2 billy_bragg di
3 melvin_kelvin blink
这显然是一个愚蠢的例子,我的真实数据集需要大量替换。
我添加了“代码”列来证明我正在使用数据框,而不仅仅是字符向量。
我一直在使用 gsub 单独替换它们,但这很耗时,而且列表不断变化。
我查看了 str_replace,但您似乎只能指定一个替换值。
任何帮助将不胜感激。
干杯!
编辑:并非所有 id 都包含下划线,我需要保留匹配的位。例如。 bob_geldolf 成为 bob_the_builder。
编辑2(!):感谢大家的建议。我通过合并数据框(以便有不需要进行更改的 NA)并使用 ifelse 语句创建新 ID 来解决这个问题。这有点笨拙,但很有效!
【问题讨论】:
标签: r replace character tidyverse gsub