7

有没有更短的方法来选择元素并修改它们?例如,在

y[y < 1] <- y[y < 1]*2

对象y在一行中被引用 4 次。是否可以减少这种重复?

4

3 回答 3

10

这是一个将引用数量减少y1 的构造:

y <- -2:2
y[i] <- y[i <- y < 1] * 10

y
# [1] -20 -10   0   1   2

但在实践中,我更有可能这样做,这可能不那么“聪明”,但肯定更容易解析(对于人类):

i <- y < 2
y[i] <- y[i] * 10
于 2012-10-23T02:05:04.617 回答
3

试试这个

y <- y*{{y<1} + 1} 

一般来说,你可以引入一个函数 f

f <- function(bool) ifelse(bool, 2, 1)
y <- y * f(y < 1) 

这种方法似乎比 Josh 的解决方案快一点

n <- 10000
y <- sample(c(1,-1), n, replace = TRUE)
f1 <- function(y){y[i] <- y[i <- y < 1] * 10; y}
f2 <- function(y){y <- y*{{y<1} + 1}; y} 
benchmark(f1(y), f2(y), replications = 50000)
  test replications elapsed relative user.self sys.self user.child sys.child
1 f1(y)        50000   30.29    2.398    27.427    3.146          0         0
2 f2(y)        50000   12.63    1.000     9.859    2.918          0         0
于 2012-10-23T02:08:41.627 回答
1

这不会减少对 的引用次数y,但会停止y>1计算两次

y <- ifelse(y<1, y, y *2)

或者你可以预定义 y <1

replacing <- y < 1

然后该行仅包含两个显式引用y

y[replacing] <- y[replacing] *2 

您可以将 y 放入 a 中data.table,然后您可以(几乎)将y重复次数减少 1

 library(data.table)
 Y <- data.table(y = y)

 Y[y <1, y := y*2]

我说差不多,因为如果你想访问 atomic vector y,你需要输入Y[,y]

于 2012-10-23T02:02:28.310 回答