是否有更短的方式来选择元素并进行修改?例如,在
中y[y < 1] <- y[y < 1]*2
对象 y 在一行中被引用4次。是否有可能减少这种重复?
答案 0 :(得分:10)
这是一个将y
的引用数量减少1的构造:
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
答案 1 :(得分: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
答案 2 :(得分:1)
这不会减少对y
的引用次数,但会阻止y>1
计算两次
y <- ifelse(y<1, y, y *2)
或者您可以预定义y&lt; 1
replacing <- y < 1
然后该行只包含对y
y[replacing] <- y[replacing] *2
你可以将y放在data.table
中,然后你可以(几乎)减少y
重复1次的次数
library(data.table)
Y <- data.table(y = y)
Y[y <1, y := y*2]
我差点说,因为如果你想访问原子向量y
,你需要输入Y[,y]