我有一个看起来像这样的矢量:
mass<-c(-2, -6, -79, 31, -28, 198, 132, 0, 262, -187, -475, 701, 926)
我需要从这个向量中总结以下值的子集:
所以在上面的示例向量中,我想从总和中排除-2,-6和-79(它们不遵循正值),但包括-28,-187和-475(因为它们在矢量中以正值表示)。
我可以总结。
的正值sum(mass[mass>0])
但我不确定如何仅包含那些符合我标准的负值。
(我需要执行类似操作的大量向量,并且它们并非都具有相同的负值/正值序列,所以我也不能通过对向量进行子集化来处理这个问题排除前三个值,因为要排除的值的数量将根据向量而不同。
非常感谢您的帮助!
答案 0 :(得分:4)
ones.you.want <- intersect(which(mass < 0), which(mass > 0)[1]:length(mass))
sum(mass[ones.you.want])
注意:如果向量中没有正值,则可能会失败。
答案 1 :(得分:1)
跟随Rguy的注释,如果向量元素都是负数,这里有一个替代方法也可以使用:
getElements <- function(X) {
id <- which(X > 0 | # +'s
c(FALSE, diff(sign(X))==-2) # - after +. (1st element always FALSE)
)
return(X[id])
}
getElements(mass)
# [1] 31 -28 198 132 262 -187 701 926
getElements(-1:-10)
# integer(0)
答案 2 :(得分:0)
sum( mass[-1][ mass[-1] < 0 & mass[-length(mass)] > 0 ] )