我有很长的识别码列表,在某些时候发现有些但不是所有的识别码都被错误地混淆了,错误被绘制出来并且错误的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])
}
有没有办法提高效率?
感谢您的帮助!
答案 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