2013-04-16 15 views
5

Birkaç matris oluşturmak ve işlev aracılığıyla elde edilen değerleri otomatik olarak belirli satırlara atamak istiyorum.Matris adı bir karakter dizesi olduğunda matrisin satırına değerler nasıl atanır

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) 
    } 
} 

ve

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

ama

"atama hedef dışı dil nesnesine genişler" döndürülür: Ben şimdiye kadar denedim ne örnek vereyim. Bu nedenle, bu hata döndürmüyor, ancak değerler matris içine yazılmadı. Bu hata döndürmüyor. İlk matrisler de

boş

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

ve bir ilmek yapıldıktan sonra, (i = 1) 1 satır doldurulur (ve sonra ikinci için tüm Örnek matrisleri expext - yani, ikinci sıra dolu döngü bittiğinde, sayılarla dolu ÖRNEK matris olurdu.).

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

nokta i macun işlevi tarafından matris adı geçmesi nedeniyle, matris satırda değer atamak değil nasıl olsa olduğunu. Adını karakter dizesi olarak koymak istersek, matriste belirli bir satıra değer atamak nasıl? Herhangi bir yardım harika olurdu. Teşekkürler

... Baskı ... Çok net olmadığım için üzgünüm. Bahsettiğim gibi, matris satırına bir fonksiyonun (matrisimle aynı sayıda sütun içerdiği) sonucunu yazmak istiyorum. Her sıra farklı gözlemlere uygulanan işlevden kaynaklanır. Birden fazla işlevi aynı değişkene uygulamak istiyorum, böylece farklı fonksiyonların sonuçları için (sütun numaralarına göre farklı olan ve farklı isimlere sahip olan) birkaç matrisim var. Numaralandırdığım ve adlandırılan matrisler, sonuçları takip etmenin ve sonra bunları karşılaştırmanın en kolay yoludur. Yukarıda matris dizisine bir değer veremediğim için bir problem örneği verdim, çünkü matrisin adını string olarak verdim (ve bunu yapıyorum çünkü aksi takdirde yapılması gereken çok sayıda numara olacaktı). j ı matrislerin adları oluşturmak için döngü ve paste0("EXAMPLE", j) neden 1-10 veya başka numaralar

sne gider ve ben için hangi gözlem belirtmek için nerede Yani genel olarak ben

EXAMPLEj[i,]<-SomeFunctionResult 

yapabilmek istiyorum Kullanılacak işlevi ve sonuca hangi satırda koyacağını. Matrisler zaten oluşturuldu, ancak sonuçları matris satırına iletmenin bir yolunu bulamadım.

R (ve programlama) 'da yeniyim, bu yüzden bunu çözmek için mümkün olan en kötü yolu seçtim ve bu liste ya da diziler kullanmak çok daha kolay olacaktır. Yanıtlarınız için teşekkür ederim.

+1

İstediğiniz sonucu verebilir misiniz? –

+0

Sütunlarda '1,2,3,4' ile bir matris oluşturmaya çalışıyorsunuz ve tüm satırlar için tekrarlıyor musunuz? –

+0

Ne yapmak istersin belli değil! Bir matris ile ne yapmak istediğinizi göstermeye çalışın. Sonra değişkenleri bir listeye koymak ve tek bir matris için ne yaptığınızı genellemek için 'do.call' veya' lapply' kullanmak daha iyi olur diye düşünüyorum. – agstudy

cevap

2

bir liste halinde bireysel matrisleri koyun: listesi de adlandırılmış ve isimlerin ulaşılabilir

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

:

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

Ardından hemen dizine göre bu listedeki matrisler erişmek : Eğer farklı Matris üzerinde yineleme çalışıyoruz gibi

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

Bugörünüyorve sonra verilen matristeki her satırın üzerinde yinelemek. Görev yineleme ise

, listeleri kullanarak düşünmek gerekir - ya da matrisleri üzerinde ilerlerken eğer, diziler Sonra

# 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 

genellikle tavsiye edilmez (yineleme için döngüler kullanmak istiyorsanız, ancak basit)

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

EXAMPLE 

Ayrıca MARGIN argüman ayarladığınız boyutlara tekabül apply kullanabilirsiniz. apply(EXAMPLE, MARGIN=3, FUN=someFunction) seferinde matrisinin her bir işlevi someFunction geçerlidir, örneğin

(yani, bu durumda, MARGIN==1 sütunlar için 2 ve 3 belirli matris için, satır için).

# 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

çalışıyorsunuz: En iç içe iki döngüler Yukarıdaki kod tek bir satır içine konabilir,

Böylece

yukarıda for döngü - Başka bir deyişle , çok daha k gibi her bir matris üzerinde yineleme edilir iki matris arasındaki farkları göstermek için?

> 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,]      
İlgili konular