簡體   English   中英

不加和功能的向量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM