如果R中尚不存在元素,则向元素添加元素的最快方法

时间:2014-01-09 11:44:45

标签: r vector unique

我正在寻找R中最快的方法,如果它尚不存在,则向元素添加元素(字符类型)。现在我只是

vect=c("a","b","c")
vect=unique(c(vect,"b"))
vect=unique(c(vect,"d"))

但我认为必须有更好的方法来做到这一点。有什么想法吗? (我的载体有大约200万个字符串(网址))

欢呼声, 汤姆

3 个答案:

答案 0 :(得分:4)

来自%chin%的{​​{1}}运算符专门用于快速处理字符向量。这是一个例子:

data.table

答案 1 :(得分:3)

显然,你想要两个向量的联合:

vect <- c("a","b","c")
add <- c( "a" , "d" , "e" , "b" )

union(vect, add)
#[1] "a" "b" "c" "d" "e"

正如Simon指出的那样,与你的解决方案相同。

以下是一些基准:

library(data.table)
library(microbenchmark)
microbenchmark(union(vect, add),c( vect , add[ ! add %chin% vect ] ),times=10)
# Unit: microseconds
#                           expr    min     lq  median     uq    max neval
#               union(vect, add) 12.628 13.243 13.3980 15.092 65.599    10
# c(vect, add[!add %chin% vect])  2.773  3.080  3.3885  4.620 51.740    10


vect <- as.character(seq_len(1e6))
microbenchmark(union(vect, add),c( vect , add[ ! add %chin% vect ] ),times=10)
#Unit: milliseconds
#                          expr       min        lq    median        uq      max neval
#              union(vect, add) 176.34441 188.82082 261.09802 339.96974 493.7810    10
#c(vect, add[!add %chin% vect])  35.37661  37.14743  47.06862  70.46896 203.7034    10

答案 2 :(得分:0)

vect <- if (!"d" %in% vect) c(vect, "d") else vect