5

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

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

使用 replace 将 x 中等于 4 的元素替换为 2。但是我怎样 才能x == 42x ==3和替换。4x == 56

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

4

3 回答 3

13

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))]

于 2013-04-26T03:33:17.623 回答
7

我闻到了 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)

这个乞求一个基准:

在此处输入图像描述

在 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
于 2013-04-26T03:23:57.840 回答
6

你可以这样做:

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

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

或使用plyr's mapvalues,它使用类似的实现match

library(plyr)
mapvalues(x, find, replace, warn.missing = FALSE)

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

于 2013-04-26T03:58:30.397 回答