Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用for循环计算最终值 上限_R_For Loop_Dplyr_Cumsum - Fatal编程技术网

不使用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的示例长得多。我知道我遗漏了一些东西。这看起来太好了,不可能是真的:这将是一个很好的解决方案。我猜它仍然会相当快。谢谢分享。