For循环和lapply
For loop and lapply
首先,我使用 for loop
作为数字向量,效果很好。
当我使用lapply
功能时,结果不是我想要的。我只想要列表中的一个元素。
这是我的例子
# With for loop, the outcome is one vector of numbers
x <- c(0.2,0.5,0.03,0.006,0.08)
p.value <- NULL
for (i in 1:length(x)){
if(x[i] > 0.5 p.value[i] <- (1-x[i])*2
else p.value[i] <- x[i]*2
# with lapply
lapply(x, function(x) {if(x > 0.5) p.value <- (1-x)*2 else p.value <- x*2
lapply
的结果是相同结果的组合。我有点意识到这个问题,但我不知道如何更改我的代码。对此有何建议?
这可以通过向量化的方式解决,因此您不需要 for
循环或 lapply
.
p.value <- ifelse(x > 0.5, (1 - x), x) * 2
lapply
代码确实为我提供了 for
循环的预期输出,但您可以更改一些东西。
- 使用
sapply
因为输出是向量
- 在
sapply
之外而不是在函数内部分配 p.value
。
- 因为你已经有一个名为
x
的向量,将匿名函数中的变量更改为另一个名称。
p.value <- sapply(x, function(y) if(y > 0.5) (1-y)*2 else y*2)
尝试 sapply
而不是 lapply
。简化列表解决方案
您可以使用 replace
,它比 ifelse
更快。
replace(x, x > .5, 1 - x)*2
# [1] 0.400 1.000 0.060 0.012 0.160
基准
x <- sample(x, 1e6, replace=T)
microbenchmark::microbenchmark(ifelse=ifelse(x > 0.5, (1 - x), x) * 2,
replace=replace(x, x > .5, 1 - x)*2)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# ifelse 25.049546 31.29303 39.53500 36.23981 42.06574 124.9903 100 b
# replace 8.074329 11.06676 18.68296 14.02976 16.99336 100.2051 100 a
首先,我使用 for loop
作为数字向量,效果很好。
当我使用lapply
功能时,结果不是我想要的。我只想要列表中的一个元素。
这是我的例子
# With for loop, the outcome is one vector of numbers
x <- c(0.2,0.5,0.03,0.006,0.08)
p.value <- NULL
for (i in 1:length(x)){
if(x[i] > 0.5 p.value[i] <- (1-x[i])*2
else p.value[i] <- x[i]*2
# with lapply
lapply(x, function(x) {if(x > 0.5) p.value <- (1-x)*2 else p.value <- x*2
lapply
的结果是相同结果的组合。我有点意识到这个问题,但我不知道如何更改我的代码。对此有何建议?
这可以通过向量化的方式解决,因此您不需要 for
循环或 lapply
.
p.value <- ifelse(x > 0.5, (1 - x), x) * 2
lapply
代码确实为我提供了 for
循环的预期输出,但您可以更改一些东西。
- 使用
sapply
因为输出是向量 - 在
sapply
之外而不是在函数内部分配p.value
。 - 因为你已经有一个名为
x
的向量,将匿名函数中的变量更改为另一个名称。
p.value <- sapply(x, function(y) if(y > 0.5) (1-y)*2 else y*2)
尝试 sapply
而不是 lapply
。简化列表解决方案
您可以使用 replace
,它比 ifelse
更快。
replace(x, x > .5, 1 - x)*2
# [1] 0.400 1.000 0.060 0.012 0.160
基准
x <- sample(x, 1e6, replace=T)
microbenchmark::microbenchmark(ifelse=ifelse(x > 0.5, (1 - x), x) * 2,
replace=replace(x, x > .5, 1 - x)*2)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# ifelse 25.049546 31.29303 39.53500 36.23981 42.06574 124.9903 100 b
# replace 8.074329 11.06676 18.68296 14.02976 16.99336 100.2051 100 a