2013-04-16 36 views
5

Tôi muốn tạo một số ma trận và chỉ định các giá trị thu được thông qua chức năng cho các hàng cụ thể một cách tự động. Tôi sẽ đưa ví dụ về những gì tôi đã cố gắng cho đến nay:Cách gán giá trị cho hàng của ma trận khi tên ma trận là một chuỗi ký tự

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

nhưng "mục tiêu của nhiệm vụ mở rộng để đối tượng phi ngôn ngữ" được trả về. Vì vậy, tôi đã thử

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

Điều này không trả về lỗi, nhưng giá trị không được ghi vào ma trận.

Tại ma trận đầu tiên là trống

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

và sau một vòng lặp được thực hiện (i = 1) Tôi expext tất cả các ma trận VÍ DỤ có 1 hàng điền (và sau thứ hai - hàng thứ hai điền, vì vậy khi vòng lặp kết thúc, tôi sẽ có ma trận EXAMPLE đầy các số.).

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

Mặc dù vậy, tôi không chỉ định giá trị cho hàng ma trận vì tôi chuyển tên ma trận bằng chức năng dán. Làm thế nào để gán giá trị cho một hàng cụ thể trong một ma trận nếu tôi muốn đặt tên của nó như là chuỗi ký tự? Bất kỳ trợ giúp sẽ là tuyệt vời. Cảm ơn

... Ấn bản ... Tôi rất tiếc vì tôi không rõ ràng lắm. Như tôi đã đề cập, tôi muốn viết kết quả của một hàm (có cùng số cột như ma trận của tôi) vào hàng ma trận. Mỗi hàng sẽ lấy kết quả từ hàm được áp dụng cho quan sát khác nhau. Tôi muốn áp dụng một số hàm cho cùng một biến vì vậy tôi có một số ma trận cho các kết quả của hàm khác nhau (khác với các số cột và có các tên khác nhau). Cách tôi đánh số và đặt tên ma trận là cách dễ nhất để theo dõi kết quả và sau đó so sánh chúng. Ở trên tôi chỉ đưa ra một ví dụ về vấn đề là tôi không thể gán giá trị cho một hàng ma trận bởi vì tôi đặt tên ma trận làm chuỗi (và tôi làm điều đó bởi vì nếu không sẽ có rất nhiều đánh số để làm). Vì vậy, nói chung tôi muốn để có thể làm

EXAMPLEj[i,]<-SomeFunctionResult 

đâu j đi 1 đến 10 hoặc một số con số khác

Thats lý do tại sao tôi sử dụng vòng lặp và paste0("EXAMPLE", j) để tạo ra tên của ma trận và tôi để biểu thị mà quan sát cho chức năng để sử dụng và trong hàng để đặt kết quả. Ma trận đã được tạo, nhưng tôi không tìm thấy cách nào để chuyển kết quả vào hàng của ma trận.

Tôi mới ở R (và lập trình) vì vậy có thể tôi đã chọn cách tồi tệ nhất có thể để giải quyết điều này và danh sách hoặc mảng sẽ dễ sử dụng hơn nhiều. Cám ơn bạn đã phản hồi của bạn.

+1

Bạn có thể đưa ra kết quả của những gì bạn muốn không? –

+0

Bạn đang cố gắng tạo một ma trận với '1,2,3,4' trên các cột và lặp lại nó cho tất cả các hàng? –

+0

Không rõ bạn muốn làm gì! Hãy thử thể hiện bạn muốn làm gì với một ma trận. Sau đó, tôi nghĩ tốt hơn là nên đặt các biến của bạn trong một danh sách và sử dụng 'do.call' hoặc' lapply' để khái quát hóa những gì bạn làm cho một ma trận đơn. – agstudy

Trả lời

2

Đặt các ma trận cá nhân vào một danh sách:

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

Sau đó, bạn chỉ cần truy cập vào các ma trận trong danh sách này bởi chỉ số:

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

Danh sách này cũng có thể được đặt tên, và truy cập bằng tên :

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

Có vẻ như bạn đang cố gắng lặp lại các ma trận khác nhau của bạn, và sau đó lặp qua từng hàng trong ma trận đã cho.

Nếu nhiệm vụ là lặp đi lặp lại, bạn nên suy nghĩ của việc sử dụng danh sách - hoặc nếu iterating qua matricies, mảng

# 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 

Sau đó, nếu bạn muốn sử dụng vòng lặp đi lặp lại (thường không được đề nghị, nhưng nó là đơn giản)

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

EXAMPLE 

bạn cũng có thể sử dụng apply, nơi mà các lập luận MARGIN tương ứng với kích thước bạn đặt. (ví dụ, trong trường hợp này, MARGIN==1 là cho các hàng, 2 cho các cột và 3 cho ma trận cụ thể)

Ví dụ, apply(EXAMPLE, MARGIN=3, FUN=someFunction) áp dụng chức năng someFunction cho mỗi matricies, cùng một lúc. Nói cách khác, nó được lặp lại trên mỗi ma trận, giống như các k - loop for trên

Như vậy, hai vòng lặp lồng nhau của bạn trên có thể được đưa vào một dòng mã:

# 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

đang cố gắng để cho thấy sự khác biệt giữa hai ma trận?

> 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,]      
Các vấn đề liên quan