将位置和总和更改为一系列新的

时间:2016-05-06 15:12:50

标签: r

我使用一个简单且可复制的例子:

我有一个函数f

f <- function(x){
    e <- seq(1, x, by = (sqrt(x)))
    e    
}

例如:

> f(1)
[1] 1
> f(2)
[1] 1
> f(3)
[1] 1.000000 2.732051
> f(4)
[1] 1 3
> f(5)
[1] 1.000000 3.236068

我想创建一个系列N,按以下方式将f(1)f(4)的每个输出相加(每次更改位置+1):

# f(1)= 1
# f(2)=   1
# f(3)=      1.000000  2.732051
# f(4)=                1         3
# f(4)=                          1.000000   3.236068

#  N = 1  1  1.000000  3.732051  4.000000   3.236068  etc...

如您所见,每个人的长度可能不同。

任何帮助?

2 个答案:

答案 0 :(得分:2)

您可以使用sapply完成此操作:

sapply(1:4, function(i) sum(f(i)))

sapply将向量1:4作为输入。然后,我创建了一个抛弃“lambda”函数,它将每个元素取为1:4,并对f函数的输出求和。

如果您想对此输出求和,可以将其包含在sumcumsum中以进行累加求和。

答案 1 :(得分:1)

您可以使用*apply将您的功能应用于该系列,但总而言之,您需要在之前和之后插入零。您可以使用rowSums获取实际金额:

N1 <- sapply(1:5, 
            function(x){
                c(rep(0, x - 1),    # insert zeros before
                  f(x), 
                  rep(0, 6 - (length(f(x)) + x - 1)))    # insert zeros after
            })
N1
#      [,1] [,2]     [,3] [,4]     [,5]
# [1,]    1    0 0.000000    0 0.000000
# [2,]    0    1 0.000000    0 0.000000
# [3,]    0    0 1.000000    0 0.000000
# [4,]    0    0 2.732051    1 0.000000
# [5,]    0    0 0.000000    3 1.000000
# [6,]    0    0 0.000000    0 3.236068

N2 <- rowSums(N1)
N2
# [1] 1.000000 1.000000 1.000000 3.732051 4.000000 3.236068