[英]Adding up a vector without the sum function
我正在嘗試學習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
謝謝!
您可以將Reduce
與+
使用。
Reduce("+", abbey[abbey > 10])
# [1] 380.7
或者,您可以使用累計和。 這比Reduce
快很多
rev(cumsum(abbey[abbey > 10]))[1]
# [1] 380.7
另一種方法是在自定義函數中使用Recall
。 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
簡單for
循環:
Sum<-0
for (i in abbey) if (i>10) Sum<-Sum+i
Sum
#[1] 380.7
但是,與sum
函數相比,這種方法可能非常慢。
您可以使用填充有一個的向量來做一個內積。
abbey2 <- abbey[abbey > 10]
as.numeric(t(matrix(abbey2)) %*% rep(1, times = length(abbey2)))
# [1] 380.7
我看到您進入了for
循環(根據您最近遇到的所有問題判斷), for
循環在R中“很昂貴”。相反,您可能需要考慮檢查Rcpp程序包,該程序包允許您在C ++中編寫高效的 for
循環並將其編譯為[R
例如(摘自Haley的AdvanedR 。(對不起@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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.