如何替换R中2个数组之间的值?

时间:2015-03-20 15:43:00

标签: r conditional-expressions

我有三个具有相同维度的数组,但我需要的是,当dat1中的对应值高于0.2时,dat2中的值会替换dat3中的相应值

数据:

dat1 <- array(1:60, c(3,5,4)) 
dat2 <- array(rnorm(60), c(3,5,4)) 
dat3 <- array(rnorm(60), c(3,5,4))

2 个答案:

答案 0 :(得分:4)

ifelse(dat3 > 0.2, dat2, dat1)

答案 1 :(得分:2)

另一种选择,首先创建索引,然后将其用于子集:

idx <- dat3 > 0.2
dat1[idx] <- dat2[idx]

评论后编辑 - 一个小的效果比较:

set.seed(2015)
N <- 1e6
dat1 <- array(N, c(3,5,4)) 
dat2 <- array(rnorm(N), c(3,5,4)) 
dat3 <- array(rnorm(N), c(3,5,4))

library(microbenchmark)
microbenchmark(
  ifelse = dat1 <- ifelse(dat3 > 0.2, dat2, dat1),
  index = {idx <- dat3 > 0.2
           dat1[idx] <- dat2[idx]},
  unit = "relative"
)

Unit: relative
   expr      min       lq   median       uq      max neval
 ifelse 5.131963 6.460236 5.545135 5.467555 33.86001   100
  index 1.000000 1.000000 1.000000 1.000000  1.00000   100

对于样本数据,索引速度比ifelse快〜5倍。

如果您对替换索引有两个限制,请改为使用以下索引:

idx <- dat3 > 0.2 & dat3 < 0.5