我正在尝试用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
谢谢!
答案 0 :(得分:4)
您可以将Reduce
与+
一起使用。
Reduce("+", abbey[abbey > 10])
# [1] 380.7
或者,您可以使用累积总和。这比Reduce
rev(cumsum(abbey[abbey > 10]))[1]
# [1] 380.7
另一种方法是在自定义函数中使用Recall
。 Recall
用作占位符,用于调用它的函数的名称。因此,在此函数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