我正在尝试对一列中的一系列行求和,直到遇到另一列中的值大于或等于阈值的值,然后将该和输出到对象中并重复该过程,然后将下一个和放入同一对象。
我主要将R用于统计,并且我编写代码的能力非常有限并且自学成才。目前,我有一系列数据集,每个数据集代表一个人。在每个数据集中有两列感兴趣的内容,大约有17,000行。我试图将一列(x)中的连续行求和,直到另一列(a)中遇到0.17或更大的值。一旦遇到此值,我需要将该总和输出到另一个对象中。然后,从下一行开始,我需要对x中的所有值求和,直到在a中遇到0.17或更大的值。因此,最后,我将有一个对象,其中包含整个数据集的所有这些和。我已经尝试了一些使用循环和if / else的函数,但没有得到合理的结果。我什至不确定这是否是最好的方法,所以任何输入都会受到赞赏。
x <- c(1,2,3,4,5,6,7,8,7,6,5,4,3,2,1)
a <- c(0.05, .10, 0.1, 0.19, 0.12, 0.15, 0.20, 0.01, 0.08, 0.11, 0.18, 0.14, 0.17, 0.01, 0.02)
summing <- function(x) {
s <- 0
leng <- Inf
n <- nrow(data2)
for(x in 1:(n-1)){
step2<- if(data2$a <= 0.17){
s <- s + x[1]
}
}
return(results)
}
summing(data2$step)
summing <- function(x) {
count <- 1
begin <- 1
results <- list()
x <- rbind(x, c(1))
n <- nrow(x)
for(i in n){
step <- sum(x[i,2], x[i + 1, 2])
t <- x[i +1, 3]
if(abs(x[i + 1, 3]) <= 0.17){
begin <- i + step
}
if(abs(x[i + 1, 3]) > 0.17){
results[[count]] <- begin:1
count <- count + 1
}
}
return(results)
}
使用此示例数据,我需要一个对象,它将前四个值加在一起(10),然后将第5-7位(18),8-11位(26),12-13位(7),14-15位相加(3)。
答案 0 :(得分:3)
您可以使用tapply
INDEX <- cumsum(a >= 0.17) - (a >= 0.17)
out <- tapply(X = x, INDEX = INDEX, FUN = sum)
out
# 0 1 2 3 4
#10 18 26 7 3
INDEX
由
INDEX
# [1] 0 0 0 0 1 1 1 2 2 2 2 3 3 4 4
正如@ d.b在评论中指出的那样,创建该分组向量的另一种方法是
INDEX = cumsum(c(FALSE, head(a, -1)) >= 0.17)