在R

时间:2017-07-01 04:02:37

标签: r sum apply seq

我正在尝试对每一行数据帧运行求和。让我们说我想把 100n ^ 2 的总和,从 n = 1 n = 4

> df <- data.frame(n = seq(1:4),a = rep(100))
> df
  n   a
1 1 100
2 2 100
3 3 100
4 4 100

更简单的例子:

fun1我们的示例求和函数。我可以拉100,因为我可以在以后繁殖它。

fun <- function(x) {
    i <- seq(1,x,1)
    sum(i^2) }

我想将此函数应用于数据帧的每一行,其中df$n提供求和的上限。

期望的结果如下df$b

> df
  n   a  b
1 1 100  1
2 2 100  5
3 3 100 14
4 4 100 30

为了达到这些效果,我尝试了应用功能

apply(df$n,1,phi)

并且还将df转换为矩阵

mat <- as.matrix(df)
apply(mat[1,],1,phi)

两者都返回错误:

Error in seq.default(1, x, 1) : 'to' must be of length 1 

我理解这个错误,因为我理解为什么seq需要&#39; to&#39;长度的价值1.我不知道如何前进。

在将数据框作为矩阵读取时,我也尝试了相同的操作。

可能不那么简单的例子:

在我的情况下,我只需将上面的结果df$b乘以100(或df$a)即可得到每行的最终答案。但在其他情况下,第二个值可能更加根深蒂固,例如 a ^ i 。我如何调用两个变量 a n

基础问题:

我的基本目标是将求和应用于数据帧(或矩阵)的每一行。以上问题源于我尝试使用seq(),正如我在本网站的答案中所建议的那样。我很乐意接受一个答案,用不同的方式来解决上述问题,以便进行总结。

1 个答案:

答案 0 :(得分:2)

如果我们应用seq,则不会为fromto采用向量。所以我们可以循环并做到这一点

df$b <- sapply(df$n, fun)
df$b
#[1]  1  5 14 30

或者我们可以Vectorize

Vectorize(fun)(df$n)
#[1]  1  5 14 30