向量化 R 循环以对向量部分求和
Vectorizing R loop for summation over vector section
我想对向量的某些部分求和。这些部分的长度由另一个向量给出,比方说 L = c(3,4)
。其元素应该相加的向量是 vec = c(3,4,2,6,5,8,1)
和 length(vec) = sum(L)
。结果,我想要一个向量 sigma
,它包含 sum(vec[1:L[1]])
和 sum(vec[(L[1]+1):L[2]])
的总和,或者在这个例子中 sum(vec[1:3])
和 sum(vec[4:7])
。在这个小例子中,解决方案是:sigma[1] = 3+4+2 = 9
和 sigma[2] = 6+5+8+1 = 20
。
请注意,这只是一个小例子,通常 L
和 vec
有更多的元素。
我想快速解决我的问题。可能通过以下循环的矢量化达到:
L = c(3,4) #length of sections
vec = c(3,4,2,6,5,8,1) #creating vector for summation
L_cum = c(0,cumsum(L)) #creating vector for the length of sections with needed indices
sigma = 0
for(i in 1:length(L)){
sigma[i] = sum(vec[(L_cum[i]+1):L_cum[i+1]]) #summation over vec[1:3] and vec[4:7]
}
你应该使用
x <- rep(seq_along(L), L) # from akrun's comment
tapply(vec, x, sum)
1 2
9 20
这也应该有效
diff(c(0,cumsum(vec)[cumsum(L)]))
我想对向量的某些部分求和。这些部分的长度由另一个向量给出,比方说 L = c(3,4)
。其元素应该相加的向量是 vec = c(3,4,2,6,5,8,1)
和 length(vec) = sum(L)
。结果,我想要一个向量 sigma
,它包含 sum(vec[1:L[1]])
和 sum(vec[(L[1]+1):L[2]])
的总和,或者在这个例子中 sum(vec[1:3])
和 sum(vec[4:7])
。在这个小例子中,解决方案是:sigma[1] = 3+4+2 = 9
和 sigma[2] = 6+5+8+1 = 20
。
请注意,这只是一个小例子,通常 L
和 vec
有更多的元素。
我想快速解决我的问题。可能通过以下循环的矢量化达到:
L = c(3,4) #length of sections
vec = c(3,4,2,6,5,8,1) #creating vector for summation
L_cum = c(0,cumsum(L)) #creating vector for the length of sections with needed indices
sigma = 0
for(i in 1:length(L)){
sigma[i] = sum(vec[(L_cum[i]+1):L_cum[i+1]]) #summation over vec[1:3] and vec[4:7]
}
你应该使用
x <- rep(seq_along(L), L) # from akrun's comment
tapply(vec, x, sum)
1 2
9 20
这也应该有效
diff(c(0,cumsum(vec)[cumsum(L)]))