[英]Looping through an id using lapply() in R
我寫了這樣的函數:
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
使用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
無需使用函數,使用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
我個人更願意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")]
除非我很笨,否則這可能很簡單。
因此,您了解如何使用lapply創建矢量res
,對嗎? 只需將其與您的id列一起加入即可。 它們的順序相同,因此ID會匹配。
cbind(data$id, res)
為什么不在數據框中包含數據,然后:
> 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.