【发布时间】: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