2015-12-21 132 views
1

我有一個矩陣,其中保存了其他矩陣或向量的名稱。使用矩陣的元素,因爲它是R中其他矩陣的名稱

比方說,像這樣:

 col1 col2 
row1 matA matB 
row2 matC matD 

凡馬塔和MATB =

matA:   col1  matB:   col1 
     row1  119    row1  105 
     row2  80    row2  99 
     row3  95    row3  70 

我將使用一個週期要經過第一矩陣的所有行。

我需要的是計算matA和matB第一行的平均值,並使用matA = rbind(-calculated_average-,matA)進行保存,與matB相同。所以結果應該是:

matA:   col1  matB:   col1 
     row1  112    row1  112 
     row2  119    row2  105 
     row3  80    row3  99 
     row4  95    row4  70 

然後週期將進入第2行計算相同的MATC和matD等

如果MATB不會定義,我需要去創造和啓動值設置爲101,結果則是:

matA:   col1  matB:   col1 
     row1  110    row1  110 
     row2  119    row2  101 
     row3  80     
     row4  95     

的關鍵,我的問題是一個函數,它可以讓我用矩陣的元素,因爲它是其他矩陣名工作。

+0

當你說矩陣沒有定義時,你的意思是變量matB不存在於R中?或者矩陣是空的? – user974514

+0

矩陣不存在於R. –

回答

0

歡迎來到SO。

正如你所提到的你自己問題的關鍵是一個函數,它將允許使用他們的名字獲取保存在內存中的對象。該功能的名稱是get。您還需要考慮的另一個功能是ls(),以檢查存儲在內存中的變量以及assign使用其名稱作爲字符串分配變量。我假設如果沒有定義矩陣它不存在於內存中。

我寫了一段可以解決問題的代碼,它當然不是最優雅的解決方案,但它可以作爲一個起點。

假設dt是您的初始矩陣的名稱。

for i in 1:nrow(dt){ 
    #check whether at least one matrix is defined 
    if(dt[i,1] %in% ls() || dt[i,2] %in% ls()){ 
    #check whether first matrix is defined 
    if(dt[i,1] %in% ls()){ 
     mat1 = get(dt[i,1]) 
    #if not define it 
    }else{ 
     mat1 = matrix(101, c(1,1)) 
    } 
    #do the same for the second matrix 
    if(dt[i,2] %in% ls(){ 
     mat2 = get(dt[i,2]) 
    }else{ 
     mat2 = matrix(101, c(1,1)) 
    } 
    #calculate averages and reassign 
    assign(dt[i,1], rbind(mean(c(mat1[1,1],mat2[1,1])), mat1)) 
    assign(dt[i,2], rbind(mean(c(mat1[1,1],mat2[1,1])), mat2)) 
    } 
}