gpt4 book ai didi

R:数值向量的条件求和

转载 作者:行者123 更新时间:2023-12-04 10:47:46 25 4
gpt4 key购买 nike

我有带有数值的向量。例如:

inVector <- c(2, -10, 5, 34, 7)

我需要转换它,以便当我遇到一个负元素时,该负元素与后续元素相加,直到将总和变为正的元素:
outVector <- c(2, 0, 0, 29, 7)

负元素将为零,以便总和保持不变。所以元素 2 和 3 将为零,第四个元素等于 29 = -10 + 5 + 34。我尝试了这样的 for 循环解决方案:
outVector <- numeric(length = length(inVector))

for(i in 1:length(inVector)) {
outVector <- inVector
outVector[i] <- ifelse(outVector[i] < 0, 0, outVector[i])
outVector[i + 1] <- ifelse(outVector[i] == 0, sum(inVector[i:(i+1)]), outVector[i + 1])
outVector <- outVector[1:length(inVector)]
}

但这没有用。但是,我最感兴趣的是也适用于 dplyr 管道的解决方案。

最佳答案

如果要优化,可以使用更高效的Reduce遍历向量的函数:

#Help function
zeroElement <- function(vec) {
r <- Reduce(function(x,y) if(x >= 0) y else sum(x,y), vec, acc=TRUE)
r[r < 0] <- 0
return(r)
}

#Use function
zeroElement(x)
#[1] 2 0 0 29 7

速度测试:快 25%:
t3 <- MakeNonNeg(BigVec)
t4 <- zeroElement(BigVec)
all.equal(t3, t4)
#[1] TRUE
library(microbenchmark)
microbenchmark(
makeNonNeg = MakeNonNeg(BigVec),
zeroElement = zeroElement(BigVec),
times=10)
# Unit: seconds
# expr min lq mean median uq max neval cld
# makeNonNeg 2.047484 2.099289 2.195988 2.111135 2.248381 2.531009 10 b
# zeroElement 1.529257 1.580789 1.666000 1.664855 1.725528 1.837825 10 a

添加 session 信息以进行比较:
sessionInfo()
R version 3.3.0 (2016-05-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

关于R:数值向量的条件求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39103071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com