在最长的时间里,我使用了类似于以下内容的代码,以便根据"查找"中的匹配来替换向量中的值。表。在此示例中,我将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
功能似乎不起作用。如果key
和input
之间没有一对一匹配,则here方法无效。
答案 0 :(得分:3)
您的代码不太正确:
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
没有被替换。请查看one1
,match(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
中)以避免调用它两次。