我想在矩阵中进行多次替换。例如,
x <-sample(1:20,50,rep=T)
replace(x, x == 4, 2)
使用 replace 将 x 中等于 4 的元素替换为 2。但是我怎样 才能x == 4
用2
、x ==3
和替换。4
x == 5
6
是否有任何内置功能可以(4,3,5)
分别替换(2,4,6)
?
我想在矩阵中进行多次替换。例如,
x <-sample(1:20,50,rep=T)
replace(x, x == 4, 2)
使用 replace 将 x 中等于 4 的元素替换为 2。但是我怎样 才能x == 4
用2
、x ==3
和替换。4
x == 5
6
是否有任何内置功能可以(4,3,5)
分别替换(2,4,6)
?
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))]
我闻到了 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
你可以这样做:
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)
这两种方法都适用于任何类型的数据。对于字符向量,您还可以转换为因子和置换级别。