2013-04-16 46 views
5

我想創建幾個矩陣並將通過函數獲得的值自動分配給特定的行。我給的例子是我到目前爲止已經試過:當矩陣名稱是字符串時如何爲矩陣的行賦值

EXAMPLE1<-matrix(ncol=4, nrow=16) 
EXAMPLE2<-matrix(ncol=4, nrow=16) 
EXAMPLE3<-matrix(ncol=4, nrow=16) 
EXAMPLE4<-matrix(ncol=4, nrow=16) 


for(i in 1:16){ 
    for(j in 1:4){ 
    paste0("EXAMPLE",j, "[",i,",","]")<- c(1:4) 
    } 
} 

for(i in 1:16){ 
    for(j in 1:4){ 
    get(paste0("EXAMPLE",j)[i,]<- c(1:4) 
    } 
} 

「分配的目標擴大到非語言的對象」返回。所以我試了

for(i in 1:16){ 
    for(j in 1:4){ 
    assign(paste0("EXAMPLE",j, "[",i,",","]"), c(1:4)) 
    } 
} 

這不會返回錯誤,但值不寫入矩陣。

起初矩陣是空

 [,1] [,2] [,3] [,4] 
[1,] NA NA NA NA 
[2,] NA NA NA NA 
[3,] NA NA NA NA 
[4,] NA NA NA NA 

和後一個環路被執行(I = 1)I expext所有實施例的矩陣有1行填充(和第二後 - 第二行填充,所以當循環結束時,我將有示例矩陣充滿數字。)。

 [,1] [,2] [,3] [,4] 
[1,] 1 2 3 4 
[2,] NA NA NA NA 
[3,] NA NA NA NA 
[4,] NA NA NA NA 

的一點是,雖然,我沒怎麼值賦給矩陣行,因爲我通過粘貼功能通過矩陣名稱。如果我想將其名稱作爲字符串,如何將值分配給矩陣中的特定行?任何幫助將是美好的。謝謝

...版... 對不起,我不是很清楚。正如我所提到的,我想寫一個函數的結果(恰好與我的矩陣具有相同的列數)到矩陣行中。每行將從應用於不同觀察的函數得到結果。我想將幾個函數應用於相同的變量,所以我有不同功能的結果(列號不同,名稱不同)的幾個矩陣。我對矩陣進行編號和命名的方式是最容易跟蹤結果並稍後進行比較。上面我給了一個問題的例子,那就是我不能給一行矩陣賦值,因爲我把矩陣的名字作爲字符串(我這樣做是因爲否則會有很多數字要做)。所以總的來說,我希望能夠做到

EXAMPLEj[i,]<-SomeFunctionResult 

中,j進1到10或其他一些數字

這就是爲什麼我使用循環和paste0("EXAMPLE", j)生成矩陣的名字,我表示這對於觀察函數使用和在哪一行放置結果。矩陣已經創建好了,但我沒有辦法將結果傳遞給矩陣的行。

我是R(和編程)的新手,所以有可能我選擇瞭解決這個問題的最糟糕方式,而且這個列表或者數組會更容易使用。謝謝你的回覆。

+1

你能給出你想要的結果嗎? –

+0

你想在列上創建一個帶有'1,2,3,4'的矩陣,並對所有行重複它? –

+0

你不明白你想要做什麼!嘗試顯示你想用一個矩陣做什麼。然後我認爲最好將你的變量放在一個列表中,並使用'do.call'或'lapply'來概括你對單個矩陣做什麼。 – agstudy

回答

2

把各個矩陣轉換成一個列表:

for(i in 1:16){ 
    for(j in 1:4){ 
    EXAMPLE[[j]][i,] <- c(1:4) 
    } 
} 

列表也可以命名,並通過名稱訪問:

EXAMPLE <- list(EXAMPLE1, EXAMPLE2, EXAMPLE3, EXAMPLE4) 

然後,只需按索引訪問矩陣在此列表:

EXAMPLE <- list(EXAMPLE1=EXAMPLE1, EXAMPLE2=EXAMPLE2, 
       EXAMPLE3=EXAMPLE3, EXAMPLE4=EXAMPLE4) 
EXAMPLE[['EXAMPLE1']] 
0

它看起來像你試圖迭代你的不同基礎, ,然後遍歷給定矩陣中的每一行。

如果任務迭代,你應該考慮使用列表中 - 或者,如果迭代超過matricies,陣列

# create an array of 5 (five) 16x4 matricies: 
EXAMPLE <- array(dim=c(16, 4, 5)) # i changed your four examples to 5, to be clear 

# Have a look at the 5 matricies: 
EXAMPLE 

# TO SELECT A SINGLE MATRIX, SAY EXAMPLE2: 
EXAMPLE[,, 2] # note the two commas 

然後,如果你想使用的循環迭代(一般不recomended,但它是簡單)

for (k in 1:5) # again, using 5 to distinguish 
    for (i in 1:16) 
    EXAMPLE[i, , k] <- i* (1:4) 

EXAMPLE 

您還可以使用apply,其中MARGIN參數對應您所設定的尺寸。 (即,在這種情況下,MARGIN==1爲行,2爲列和3用於特定矩陣)

例如,apply(EXAMPLE, MARGIN=3, FUN=someFunction)在時間應用功能someFunction到每個matricies的,一個。 換句話說,它遍歷每個矩陣,很像k - for環以上

因此,你的兩個嵌套循環上面可以投入的一行代碼:

# note the empty [ ] to maintain array properties 
EXAMPLE[ ] <- apply(EXAMPLE, 3, function(M) 1:ncol(M) %x% 1:nrow(M)) 

# have a look at the results 
EXAMPLE 
0

嘗試顯示兩個矩陣之間的差異?

> EXAMPLE2 <- matrix(ncol=4, nrow=16, sample(1:10, 4*16, replace=TRUE)) 

> EXAMPLE1 <- EXAMPLE2 
> EXAMPLE1[3,4] <- 99 

> diffs <- ifelse(EXAMPLE1!=EXAMPLE2, EXAMPLE1, "") 
> diffs 
     [,1] [,2] [,3] [,4] 
[1,] "" "" "" "" 
[2,] "" "" "" "" 
[3,] "" "" "" "99" 
[4,] "" "" "" "" 
[5,] "" "" "" "" 
[6,] "" "" "" "" 
[7,] "" "" "" "" 
[8,] "" "" "" "" 
[9,] "" "" "" "" 
[10,] "" "" "" "" 
[11,] "" "" "" "" 
[12,] "" "" "" "" 
[13,] "" "" "" "" 
[14,] "" "" "" "" 
[15,] "" "" "" "" 
[16,] "" "" "" "" 

> print(diffs, quote=FALSE) 
     [,1] [,2] [,3] [,4] 
[1,]      
[2,]      
[3,]    99 
[4,]      
[5,]      
[6,]      
[7,]      
[8,]      
[9,]      
[10,]      
[11,]      
[12,]      
[13,]      
[14,]      
[15,]      
[16,]