使用R中的lapply()循环访问id

时间:2014-10-24 12:56:38

标签: r apply lapply

我写了这样一个函数:

myfunc <- function(data, c1, c2, c3) {
          res <- data*c1*c2*c3
          return(res)
          }   

要在矢量myfunc上应用data,我可以使用

lapply(data, myfunc, c1=2, c2=3, c3=4)

但是我必须循环id和向量data,以便生成的向量(或矩阵)的每一行都包含一个id和相应的结果。

因此,对于简单的情况,这将是:

myfunc <- function(id, data, c1, c2, c3) {
          res <- data*c1*c2*c3
          return(c(id, res))
          }   

但我不能使用lapply。 我已经尝试将所有输入(id, data, c1, c2, c3)放在矩阵中以使用apply

apply(matrix, 1, myfunc)

但它不起作用。

那么实现这一目标的最佳途径是什么?

提前致谢!

编辑:

这可能是数据矩阵:

      id data c1  c2  c3
 [1,] 32 1.12  2 2.5 2.8
 [2,] 33 1.14  2 2.5 2.8
 [3,] 34 1.21  2 2.5 2.8
 [4,] 35 1.22  2 2.5 2.8
 [5,] 36 1.27  2 2.5 2.8
 [6,] 37 1.30  2 2.5 2.8
 [7,] 38 1.32  2 2.5 2.8
 [8,] 39 1.36  2 2.5 2.8
 [9,] 40 1.44  2 2.5 2.8
[10,] 41 1.45  2 2.5 2.8

列id应循环通过,myfunc应应用于其他列。 我期望(或要求)这样的结果:

      id   res
 [1,] 32 15.68
 [2,] 33 15.96
 [3,] 34 16.94
 [4,] 35 17.08
 [5,] 36 17.78
 [6,] 37 18.20
 [7,] 38 18.48
 [8,] 39 19.04
 [9,] 40 20.16
[10,] 41 20.30

4 个答案:

答案 0 :(得分:1)

无需使用函数,使用data.table这是您数据的原子示例:

library(data.table)

lst = list(id=c(32,33,34), data=c(1.12,1.14,1.21), c1=rep(2,3),c2=rep(2.5,3),c3=rep(2.8,3))
M = do.call(cbind, lst)

 #     id data c1  c2  c3
#[1,] 32 1.12  2 2.5 2.8
#[2,] 33 1.14  2 2.5 2.8
#[3,] 34 1.21  2 2.5 2.8

dt = as.data.table(M)

我们可以继续:

dt[,res:=data*c1*c2*c3]
as.matrix(dt[,list(id,res)])
#     id   res
#[1,] 32 15.68
#[2,] 33 15.96
#[3,] 34 16.94

答案 1 :(得分:1)

我个人宁愿选择apply

x <- data.frame(id = 32:41, 
                data = c(1.12, 1.14, 1.21, 1.22, 1.27, 1.3, 1.32, 1.36, 1.44, 1.45), 
                c1 = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 
                c2 = c(2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5), 
                c3 = c(2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8))
x$res <- apply(x[,-1],1,prod)
x[, c("id", "res")]

答案 2 :(得分:0)

除非我愚蠢,否则这很简单。

那么,你了解如何使用lapply来创建向量res,对吧?只需将其加入您的ID列即可。它们将按相同的顺序排列,因此ID将匹配。

cbind(data$id, res)

答案 3 :(得分:0)

为什么不在数据框中包含数据,然后:

> ddf$res = with(ddf, data*c1*c2*c3)
> ddf
      id data c1  c2  c3   res
[1,]  32 1.12  2 2.5 2.8 15.68
[2,]  33 1.14  2 2.5 2.8 15.96
[3,]  34 1.21  2 2.5 2.8 16.94
[4,]  35 1.22  2 2.5 2.8 17.08
[5,]  36 1.27  2 2.5 2.8 17.78
[6,]  37 1.30  2 2.5 2.8 18.20
[7,]  38 1.32  2 2.5 2.8 18.48
[8,]  39 1.36  2 2.5 2.8 19.04
[9,]  40 1.44  2 2.5 2.8 20.16
[10,] 41 1.45  2 2.5 2.8 20.30