计算嵌套和

时间:2019-12-21 23:30:52

标签: r apply

我想在R中计算以下类型的东西:

formular

重要的是求和可以是任何函数f(y,x)。

到目前为止,我的方法是使用嵌套的for循环:

n <- 5
fun <- function(y,x){y^2 + sqrt(y*x)} # might be any function of y and x
sum_x <- c()
for(x in 1:n){
  sum_y <- c()
  for(y in 0:x){
    sum_y[y+1] <- fun(y,x)
  }
  sum_x[x] <- sum(sum_y)
}
sum(sum_x) # 147.6317

但是,我不喜欢这种方法。如果下限和上限需要更灵活,这将非常丑陋并且变得非常不便。我曾考虑过使用expand.grid,然后使用funmapply应用于它,但是却不知道如何表达和的嵌套结构。有什么建议怎么做吗?

3 个答案:

答案 0 :(得分:2)

您可以基于功能执行outer产品。该外部乘积将查看两个输入变量的所有组合,并将结果放置在矩阵中;它采用以下形式:

outer(<rows>, <cols>, FUN)

具体而言,满足以下条件:

n <- 5

fun <- function(x, y) {ifelse (y > x, 0, y^2 + sqrt(x * y))}

outer(1:n, 1:n, FUN = fun) %>% sum() # 147.6317

由于y的范围从0y都出现,因此默认为0(偶然)。无论如何,在这种情况下有必要在函数定义中包括某种形式的索引编制,因为y的嵌套求和取决于x

答案 1 :(得分:1)

我们也可以将outer中的rowCumsumsmatrixStats一起使用

library(matrixStats)
sum(outer(seq_len(n), seq_len(n), FUN = fun) * rowCumsums(diag(n)))
#[1] 147.6317

或者使用crossing中的tidyr

library(tidyr)
library(dplyr)
crossing(x = seq_len(n), y = seq_len(n)) %>%
   filter(y <= x) %>%
   transmute(out = fun(y, x)) %>%
   summarise(out = sum(out)) %>% 
   pull(out)
#[1] 147.6317

答案 2 :(得分:1)

您可以使用嵌套的beforeRouteEnter,该嵌套的sapply仅适用于必需的术语,然后再使用其中的fun

sum