使用Sub或replace替换R中的多个值

时间:2014-05-09 15:01:59

标签: r replace substitution

我有很长的识别码列表,在某些时候发现有些但不是所有的识别码都被错误地混淆了,错误被绘制出来并且错误的ID代码识别出错误的合作伙伴。现在一切都必须正确。

然而,代码列表(正确和混合)非常长,它们是每个ID代码的多个条目,以及需要纠正的大量ID代码。我找到了替换多个值的各种解决方案,但它们似乎主要涉及键入映射而不是比较两个向量,请参阅:Dictionary style replace multiple items in R

如果您可以对所有内容进行1对1的映射,或者在有很多条目停止如此强大的情况下不要写出所有内容,那就没关系了。我所做的解决方案如下:

设置数据集和"翻译"载体:

y <- cbind(paste(letters, letters, sep=""), seq(1:26))
y[6,1] <- "a"
current <- c( "aa", "ee", "kk", "mm")
tmp <- c("11", "22", "33", "44")
correct <-c("ee", "mm", "zz", "aa")

替代解决方案:

for (i in 1:length(unique(current))) {
y[,1] <- sub(current[i], tmp[i],y[,1])
}
for (i in 1:length(unique(current))) {
y[,1] <- sub(tmp[i], correct[i],y[,1])
}

有没有办法提高效率?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是将正确的名称设置为当前,然后您可以轻松地为其分配新值

names(correct) <- current
y[y[,1] %in% current,1] <- correct[y[y[,1] %in% current,1]]

打破这一点:

y[,1] %in% current是需要更改变量的向量

y[y[,1] %in% current,1]是要更改的值

correct[y[y[,1] %in% current,1]]是根据您在y中的显示方式排序的新值。

答案 1 :(得分:1)

这是一种方法:

library(gsubfn)
tmp2 <- as.list(correct)
names(tmp2) <- current

pat <- paste(current, collapse='|')

y[,1] <- gsubfn(pat,tmp2, y[,1])

这会查找任何错误的代码,然后在转换列表中查找当前代码(tmp2)并将其替换为正确的值。

答案 2 :(得分:1)

这是一种使用match的替代方法,可以在不需要临时变量的情况下立即进行所有交换

swap <- match(y[,1], current)
y[which(!is.na(swap)),1] <- correct[na.omit(swap)]
产生相同结果的

是您的代码。如果看起来是more efficient by this benchmark