【问题标题】:Sum an ever increasing number of rows until a specific min/max value is exceeded对不断增加的行数求和,直到超过特定的最小值/最大值
【发布时间】:2014-02-06 16:17:08
【问题描述】:

我正在使用数据表,并且有一列包含数字或 NA。从第 1 行开始,我想通过添加最小行数来对列求和,直到达到或超过特定值,或者遇到 NA。然后它应该从第 2 行重新开始,对每一行重复。一旦它通过了一个 NA 作为新的起始位置,它就可以继续到下一个 NA。

如果两个目标都没有达到,则返回值应该是 sum 或 NA。

数字的范围可以是任何值,但大多是 -1、0 和 1。

我编写了一个函数,但它的速度超过了 400 万行。有没有办法可以更快地做到这一点?我想改变 PosMax 和 NegMax 变量。

感谢您的帮助。

z <- c(1, 1, NA, 2, -1, 0, 0, 0, -1, 1 ,1, -1, 0 ,0 ,0, 1)
FindMovement(z, 2, -1)
  [1]  2 NA NA  2 -1 NA NA NA -1  2 NA -1 NA NA NA NA

功能是:

FindMovement <- function(Change.Col, PosMax, NegMax) {
  y <- NULL
  x <- Change.Col
  for(m in 1:length(x)) {
    y[m] <- 0
    if (x[m] != 0 & !is.na(x[m])) { 
      for (n in m:length(x)) {
        if(is.na(x[n])) { break }
        y[m] <- sum(x[m:n])
        if (y[m] >= PosMax | y[m] <= NegMax) {
          break
        }
      }
    }
  if (y[m] < PosMax & y[m] > NegMax) { y[m] <- NA }
  }
  return(y)
}

编辑:对造成的混乱表示歉意。如果起始编号为零,则结果应为 NA。

为了澄清,使用 z

Position  1:  1 + 1 = 2 (PosMax)
Position  2:  1 + NA = NA
Position  3:  NA = NA
Position  4:  2 = 2
Position  5: -1 = -1 (NegMax)
Position  6:  0 = NA 
Position  7:  0 = NA
Position  8:  0 = NA
Position  9: -1 = -1
Position 10:  1 + 1 = 2
Position 11:  1 + -1 + 0 + 0 + 0 + 1 = NA (Target not reached)
Position 12: -1 = -1
Position 13:  0 = NA
Position 14:  0 = NA
Position 15:  0 = NA
Position 16:  1 = NA

【问题讨论】:

  • 我已经阅读了第一段几次,但我看不出该描述如何与您的 FindMovement 函数的输出相匹配。请您编辑您的问题以与我们讨论它是如何工作的。
  • 在 c 中重新编码该函数并使用 inline 包运行它并不难

标签: r


【解决方案1】:

试试这个,目前无法测试性能,但应该更快:

z.mat <- matrix(rep(z, length(z)), ncol=length(z))
# zero out prior values for each col
z.mat[upper.tri(z.mat)] <- 0
# get a cumsum of each column
z.mat.sum <- apply(z.mat, 2, cumsum)
# add condition that if series starts with 0, should be NA
diag(z.mat.sum)[diag(z.mat.sum) == 0] <- NA
# get the first of -1, 2, or NA in the cumsum
result <- apply(z.mat.sum, 2, function(x) x[which.max(x %in% c(-1, 2, NA))])
# for columns that didn't get to a target, you'll get 0, so replace these with NA
result[result == 0] <- NA
result
# [1]  2 NA NA  2 -1 NA NA NA -1  2 NA -1 NA NA NA NA

【讨论】:

  • 谢谢,运行良好(尽管我移动了球门柱),但当我尝试将其应用于一组 400 万个数字时内存不足。
  • 您可以在NAs 处拆分向量并单独处理每个部分,然后合并结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 2018-12-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多