我写了这样一个函数:
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
答案 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