2017-07-03 62 views
0

我重複超過10個函數,三次或更多次R中的每個函數!這是非常混亂和浪費我的時間。我理解應用函數的想法,但非常基本,需要幫助解決這個問題。如何在r中使用具有多個參數的函數列表的apply函數?

我有這些功能(我的全部功能的一部分):

sel_1 <- lower.tri(fam1) # selector for lower triangular matrix 
    if (check.pars & (any(fam1 != 0) | any(!is.na(par11)))) { 
      BiCopCheck(fam1[sel_1], par11[sel_1], par21[sel_1], call = match.call()) 
    } 
    sel_2 <- lower.tri(fam2) 
    if (check.pars & (any(fam2 != 0) | any(!is.na(par11)))) { 
      BiCopCheck(fam2[sel_2], par12[sel_2], par22[sel_2], call = match.call()) 
    } 
    sel_3 <- lower.tri(fam3) 
    if (check.pars & (any(fam3 != 0) | any(!is.na(par13)))) { 
      BiCopCheck(fam3[sel_3], par13[sel_3], par23[sel_3], call = match.call()) 
    } 


    MixRVM1 <- list(Matrix = Matrix, 
      fam1 = fam1, 
      par11 = par11, 
      par21 = par21, 
      names = names, 
      MaxMat = MaxMat, 
      CondDistr = CondDistr) 
    MixRVM12 <- list(Matrix = Matrix, 
      fam2 = fam2, 
      par12 = par12, 
      par22 = par22, 
      names = names, 
      MaxMat = MaxMat, 
      CondDistr = CondDistr) 

有一種簡單的方法來重複這些功能呢?

+0

可以使用mapply功能 –

+1

把所有的十大功能在一個功能? – Jimbou

+0

我想你在第6行有一個錯字,不應該是'is.na(par12)'嗎?另外,你似乎給MaxMat1等和ConDistr1等分配了相同的值3次。如果數據不是結構化的,你應該儘可能使用列表和數組,如果你的數據沒有結構化,你就不能使用利用對象結構的函數。 –

回答

3

很難沒有數據,但按照這些原則,你應該能夠提高你的代碼:

,如果你不已經有一個整潔格式的FAM和參數變量(你應該,如果你擁有控制權):

fam_variables <- grep("fam[0-9]",ls(),value=TRUE) 
fam_variables <- sel_variables[order(sapply(fam_variables,function(x){as.numeric(substr(x,4,nchar(x)))}))] 
fam <- lapply(fam_variables,get) # assuming there's no missing sel variable from 1 to n! 
par_list <- list(list(par11,par12,par13),list(par21,par22,par23)) 

然後你可以使用在應用這些列表功能:

sel <- lapply(fam,lower.tri) 
sapply(1:3,function(i){BiCopCheck(fam[[i]][sel[[i]]], par_list[[1]][[i]][sel[[i]]], par_list[[2]][[i]][sel[[i]]], call = match.call())}) 

MixRVM <- list() # we create a list, and we'll keep the same structure for every item (so the name will be the same among elements) 
for (i in 1:2){ 
    MixRVM[[i]] <- list(Matrix = Matrix, 
          fam = fam[[i]], 
          par1i = par_list[[1]][[i]], 
          par2i = par_list[[2]][[i]], 
          names = names, 
          MaxMat = MaxMat, 
          CondDistr = CondDistr) 
} 
+0

非常感謝你,我還沒有數據,我需要設置這些矩陣然後模擬一個數據,我會試試看看。 – Alice

+1

我無法理解'fam_variables',你能請給我解釋一下 – Alice

+0

你有幾個變量fam,叫做fam1,fam2,fam3,可能還有更多(我不知道這些變量是什麼)當你有相同的「kind」值時,最好組織他們在結構化的數據中,比如data.frames或lists。我的第一行在工作場所檢查是否有名爲「fam和a number」的變量並將它們的值放在一個列表中,你應該在你的腳本中做些什麼定義'fam < - list()'並用你的值填充它:'fam [[1]] < - some_value','fam [[2]] < - some_other_value'等...嘗試找到一些關於列表和數組的教程R –

相關問題