Как заменить значения между 2 массивами в R?

У меня есть три массива, которые имеют одинаковые размеры, но мне нужно заменить значения в dat1 по соответствующим значениям из dat2 когда только соответствующие значения в dat3 выше 0,2.

данные:

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 ответа

Решение

Другой вариант, сначала создать индекс, а затем использовать его для подмножества:

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

Для выборочных данных индексирование происходит в ~5 раз быстрее, чем ifelse.

Если у вас есть два ограничения для индекса замены, просто используйте следующий индекс:

idx <- dat3 > 0.2 & dat3 < 0.5
ifelse(dat3 > 0.2, dat2, dat1)
Другие вопросы по тегам