簡體   English   中英

在R中使用lapply()遍歷id

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM