R中的多次替换

时间:2013-04-26 03:15:07

标签: r

我想在矩阵中进行多次替换。例如,

x <-sample(1:20,50,rep=T)
replace(x, x == 4, 2)

使用replace替换x中等于4的元素。但是,如何将x == 4替换为2,将x ==3替换为4,将x == 5替换为6

是否有任何内置函数可以分别用(4,3,5)替换(2,4,6)

3 个答案:

答案 0 :(得分:10)

1)试试这个:

 replace(seq(20), c(4,3,5), c(2,4,6))[x]

2)这是一个更通用的方法:

 c(2, 4, 6, x)[match(x, c(4, 3, 5, x))]

第二种方法的形式为:c(new, x)[match(x, c(old, x))]

答案 1 :(得分:6)

我闻到了data.table回答烹饪,但这是一种环境查找方法:

n <-50; set.seed(10)
x <-sample(1:20,50,rep=T) 

inputs <- c(4,3,5) 
outputs <- c(2,4,6)

library(qdap)
lookup(x, inputs, outputs, missing = NULL)

这个请求基准:

enter image description here

10,000个长度载体(10个重复):

Unit: microseconds
      expr      min       lq     median        uq       max neval
  LOOKUP() 9875.384 9992.475 10236.9230 10571.405 11588.846    10
 REPLACE()   76.973   85.837    94.7005   104.031   111.961    10
    PLYR()  904.082  924.142   952.8315   973.124  1017.442    10
   MATCH() 1796.034 1825.423  1864.3760  1881.870  1902.396    10

答案 2 :(得分:6)

你可以这样做:

find    <- c(4,3,5)
replace <- c(2,4,6)
found   <- match(x, find)

ifelse(is.na(found), x, replace[found])

或使用plyr的{​​{1}}使用mapvalues使用类似的实现:

match

这两种方法都适用于任何类型的数据。对于角色向量,您还可以转换为因子和置换级别。