添加没有sum函数的向量

时间:2014-10-19 15:19:45

标签: r

我正在尝试用R学习编程。

有人可以告诉我如何在不使用函数sum的情况下对此向量求和吗?这只是我想要做的一项练习。

从包MASS,数据abbey

[1]   5.2   6.5   6.9   7.0   7.0   7.0   7.4   8.0   8.0   8.0   8.0   8.5   9.0     9.0  10.0  11.0  11.0  12.0
[19]  12.0  13.7  14.0  14.0  14.0  16.0  17.0  17.0  18.0  24.0  28.0  34.0 125.0

我想只将值加在10之上。

所以结果应该与函数sum

一样
sum(abbey[abbey>10])

380.7

我试图用for循环和if else函数来做,并且到目前为止已经设法做到了这一点:

y= for (i in seq(abey)) {

  if(i>10) { sum(i)} 

}

但它返回

NULL

谢谢!

4 个答案:

答案 0 :(得分:4)

您可以将Reduce+一起使用。

Reduce("+", abbey[abbey > 10])
# [1] 380.7

或者,您可以使用累积总和。这比Reduce

快得多
rev(cumsum(abbey[abbey > 10]))[1]
# [1] 380.7

另一种方法是在自定义函数中使用RecallRecall 用作占位符,用于调用它的函数的名称。因此,在此函数mySum中,它以递归方式对值进行求和。

mySum <- function(x) {
    if(length(x) == 2) { 
        x[1] + x[-1] 
    } 
    else {
        x[1] + Recall(x[-1])
    }
}
mySum(abbey[abbey > 10])
# [1] 380.7

答案 1 :(得分:3)

简单for循环:

    Sum<-0
    for (i in abbey) if (i>10) Sum<-Sum+i
    Sum
    #[1] 380.7

但是,与sum函数相比,这种方式可能非常慢。

答案 2 :(得分:3)

你可以做一个带有向量的内部产品。

abbey2 <- abbey[abbey > 10]
as.numeric(t(matrix(abbey2)) %*% rep(1, times = length(abbey2)))
# [1] 380.7

答案 3 :(得分:1)

我看到你进入for循环(根据你最近的所有问题判断),for循环是“昂贵的”#34;在R.相反,您可能需要考虑检查 Rcpp 包,它允许您在C ++中编写高效的 for循环并将它们编译为R

例如(摘自Haley's Advaned R。(抱歉@Dirk,我自己懒得写它)))

library(Rcpp)
cppFunction('double sumC(NumericVector x) {
  int n = x.size();
  double total = 0;
  for(int i = 0; i < n; ++i) {
    total += x[i];
  }
  return total;
}')

library(MASS)
sumC(abbey[abbey > 10])
## [1] 380.7