通过查找表替换值

时间:2015-08-19 01:08:28

标签: r

在最长的时间里,我使用了类似于以下内容的代码,以便根据"查找"中的匹配来替换向量中的值。表。在此示例中,我将input对象中的值替换为key对象中的相应值(如果它们与key的第二列中的任何值匹配。

key<-cbind(c("one","one","two","three","four","five"),c("one1","one11","two2","three3","over","over"))

input<-c("one1","one11","three","four","five")

input[which(!is.na(match(key[,2],input)))]<-key[!is.na(match(key[,2],input)),1]

有更有效的方法来实现这一目标吗? merge功能似乎不起作用。如果keyinput之间没有一对一匹配,则here方法无效。

1 个答案:

答案 0 :(得分:3)

您的代码不太正确:

  • 请注意,LHS索引中的match(key[, 2], input)长度为6(key的长度)而不是5(长度input),因此{{1} }长度为6而不是5,!is.na()which(!is.na())的索引,而不是key的索引。
  • 您还会失去匹配的顺序。通过在右侧使用input(它在您的示例中有效,因为!is.na()的行恰好与key中要替换的内容相同,并且顺序相同)。

作为一个说明性示例,让我们对您的input

进行随机播放
key

注意您的新key <- key[c(3,2,4,5,6,1), ] input[which(!is.na(match(key[,2],input)))]<-key[!is.na(match(key[,2],input)),1] input [1] "one1" "one" "three" "four" "five" "one" 现在有6个变量,第一个input没有被替换。请查看one1match(key[,2], input)is.na(...),了解原因。

which(is.na(...))match(input, key[,2])中匹配时,您需要使用非NA的input[i],并且该索引的值为key。现在,您可以使用LHS上的key进行分配,但不要在右侧使用!is.na(),否则会丢失!is.na()中匹配的索引。

key

就更高效率而言,我认为这是最好的 - m <- match(input, key[,2]) # 6 2 NA NA NA for the shuffled `key` input[!is.na(m)] <- key[na.omit(m), 1] # or a one-liner input[!is.na(match(input, key[,2]))] <- key[na.omit(match(input, key[,2])), 1] 内部调用merge,所以肯定会更慢。它不是优雅的,而是快速的。

我看到的唯一改进是首先存储匹配(就像我上面所做的那样,将匹配存储在match中)以避免调用它两次。