我想在R中计算以下类型的东西:
重要的是求和可以是任何函数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
,然后使用fun
将mapply
应用于它,但是却不知道如何表达和的嵌套结构。有什么建议怎么做吗?
答案 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
的范围从0
到y
都出现,因此默认为0
(偶然)。无论如何,在这种情况下有必要在函数定义中包括某种形式的索引编制,因为y
的嵌套求和取决于x
。
答案 1 :(得分:1)
我们也可以将outer
中的rowCumsums
与matrixStats
一起使用
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