如何替换 R 中两个数组之间的值?
How to replace values between 2 arrays in R?
我有三个维度相同的数组,但我需要用 dat2
中的相应值替换 dat1
中的值,而只有 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))
ifelse(dat3 > 0.2, dat2, dat1)
另一个选项,先创建一个索引,然后用它来子集:
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
我有三个维度相同的数组,但我需要用 dat2
中的相应值替换 dat1
中的值,而只有 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))
ifelse(dat3 > 0.2, dat2, dat1)
另一个选项,先创建一个索引,然后用它来子集:
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