不使用for循环计算最终值 上限
我们可以设计一个函数不使用for循环计算最终值 上限,r,for-loop,dplyr,cumsum,R,For Loop,Dplyr,Cumsum,我们可以设计一个函数 upper.limit <- 15 starting.limit <- 5 lower.limit <- 0 set.seed(123) x <- sample(-20:20) for(i in 1:length(x)){ k <- starting.limit + x[i] k <- ifelse(k > upper.limit, upper.limit, ifels
upper.limit <- 15
starting.limit <- 5
lower.limit <- 0
set.seed(123)
x <- sample(-20:20)
for(i in 1:length(x)){
k <- starting.limit + x[i]
k <- ifelse(k > upper.limit, upper.limit, ifelse(k < lower.limit, lower.limit,k))
starting.limit <- k
}
基准
我使用以下代码来评估性能。累计
比包含400001
元素的向量上的for循环快一点
library(purrr)
accumulate(c(5, x), k_fun)
# [1] 5 0 11 6 15 15 0 0 10 15 9 15 8 7 3 0 3 0 15 2 2 14 15 7 4 15 15 3 15 0
# [31] 5 0 0 4 12 0 6 7 9 0 0 15
库(微基准)
perf我们可以设计一个函数
upper.limit <- 15
starting.limit <- 5
lower.limit <- 0
set.seed(123)
x <- sample(-20:20)
for(i in 1:length(x)){
k <- starting.limit + x[i]
k <- ifelse(k > upper.limit, upper.limit, ifelse(k < lower.limit, lower.limit,k))
starting.limit <- k
}
基准
我使用以下代码来评估性能。累计
比包含400001
元素的向量上的for循环快一点
library(purrr)
accumulate(c(5, x), k_fun)
# [1] 5 0 11 6 15 15 0 0 10 15 9 15 8 7 3 0 3 0 15 2 2 14 15 7 4 15 15 3 15 0
# [31] 5 0 0 4 12 0 6 7 9 0 0 15
库(微基准)
perf您可以使用tidyverse
首先,将x
放入数据帧
library(microbenchmark)
perf <- microbenchmark(
m1 = {upper.limit <- 15
starting.limit <- 5
lower.limit <- 0
set.seed(123)
x <- sample(-200000:200000)
for(i in 1:length(x)){
k <- starting.limit + x[i]
k <- ifelse(k > upper.limit, upper.limit, ifelse(k < lower.limit, lower.limit,k))
starting.limit <- k
}},
m2 = {
set.seed(123)
x <- sample(-200000:200000)
vec <- purrr::accumulate(c(5, x), k_fun)
k <- tail(vec, 1)
})
# Unit: milliseconds
# expr min lq mean median uq max neval
# m1 821.1735 879.3551 956.7404 941.1145 1019.8603 1290.800 100
# m2 649.3444 717.5986 773.3652 768.0313 823.5749 1006.148 100
输出:
perf <- microbenchmark(
m1 = {upper.limit <- 15
starting.limit <- 5
lower.limit <- 0
set.seed(123)
x <- sample(-200000:200000)
for(i in 1:length(x)){
k <- starting.limit + x[i]
k <- ifelse(k > upper.limit, upper.limit, ifelse(k < lower.limit, lower.limit,k))
starting.limit <- k
}},
m2 = {
set.seed(123)
x <- sample(-200000:200000)
vec <- purrr::accumulate(c(5, x), k_fun)
k <- tail(vec, 1)
},
m3 = {
x <- sample(-200000:200000)
xd <- as.data.frame(x)
colnames(xd) <- c("dat")
xd %>%
mutate(sm = starting.limit) %>%
mutate(sm = if_else(sm+lead(dat,1) > upper.limit, upper.limit
, if_else(sm+lead(dat,1) < lower.limit, lower.limit, sm) )) %>%
select(sm) %>%
filter(sm != is.na(sm)) %>%
tail(n=1)
}
)
您可以使用tidyverse
首先,将x
放入数据帧
library(microbenchmark)
perf <- microbenchmark(
m1 = {upper.limit <- 15
starting.limit <- 5
lower.limit <- 0
set.seed(123)
x <- sample(-200000:200000)
for(i in 1:length(x)){
k <- starting.limit + x[i]
k <- ifelse(k > upper.limit, upper.limit, ifelse(k < lower.limit, lower.limit,k))
starting.limit <- k
}},
m2 = {
set.seed(123)
x <- sample(-200000:200000)
vec <- purrr::accumulate(c(5, x), k_fun)
k <- tail(vec, 1)
})
# Unit: milliseconds
# expr min lq mean median uq max neval
# m1 821.1735 879.3551 956.7404 941.1145 1019.8603 1290.800 100
# m2 649.3444 717.5986 773.3652 768.0313 823.5749 1006.148 100
输出:
perf <- microbenchmark(
m1 = {upper.limit <- 15
starting.limit <- 5
lower.limit <- 0
set.seed(123)
x <- sample(-200000:200000)
for(i in 1:length(x)){
k <- starting.limit + x[i]
k <- ifelse(k > upper.limit, upper.limit, ifelse(k < lower.limit, lower.limit,k))
starting.limit <- k
}},
m2 = {
set.seed(123)
x <- sample(-200000:200000)
vec <- purrr::accumulate(c(5, x), k_fun)
k <- tail(vec, 1)
},
m3 = {
x <- sample(-200000:200000)
xd <- as.data.frame(x)
colnames(xd) <- c("dat")
xd %>%
mutate(sm = starting.limit) %>%
mutate(sm = if_else(sm+lead(dat,1) > upper.limit, upper.limit
, if_else(sm+lead(dat,1) < lower.limit, lower.limit, sm) )) %>%
select(sm) %>%
filter(sm != is.na(sm)) %>%
tail(n=1)
}
)
即使在x中有一个10k的样本,这也需要几分之一秒。我的意思是我有10000个x数据集。并不是说x有10000个元素。即使x中有10k个样本,这也需要几分之一秒。我的意思是我有10000个x数据集。并不是说x有10000个元素,我的意思是我有10000个数据集。并不是说x有10000个元素。我把我的解决方案包括在你的微基准中,看起来速度更快。你能核实一下吗?@Aramis7d我没有时间核实你的结果。但我相信你的结果。这似乎是一种将操作矢量化的好方法。@KS89在您最初的问题中,您不清楚您所说的是10000个数据集。因为您提供了一个向量x
,所以我以为您在谈论x
的长度。我想大多数人对你的问题的理解和我一样。哦,对不起。我将修改这个问题。但是你的解决方案很好,非常感谢。我的意思是我有10000个数据集。并不是说x有10000个元素。我把我的解决方案包括在你的微基准中,看起来速度更快。你能核实一下吗?@Aramis7d我没有时间核实你的结果。但我相信你的结果。这似乎是一种将操作矢量化的好方法。@KS89在您最初的问题中,您不清楚您所说的是10000个数据集。因为您提供了一个向量x
,所以我以为您在谈论x
的长度。我想大多数人对你的问题的理解和我一样。哦,对不起。我将修改这个问题。但是你的解决方案很好,非常感谢。xd
的行数是多少?请注意,我将x
更改为sample(-200000:200000)
,比OP的示例长得多。我知道我遗漏了一些东西。这看起来太好了,不可能是真的:这将是一个很好的解决方案。我猜它仍然会相当快。谢谢分享,等等。xd
的行数是多少?请注意,我将x
更改为sample(-200000:200000)
,比OP的示例长得多。我知道我遗漏了一些东西。这看起来太好了,不可能是真的:这将是一个很好的解决方案。我猜它仍然会相当快。谢谢分享。