2017-05-28 3 views
0

J'ai commencé à utiliser R aujourd'hui, donc je m'excuse si c'est trop basique.Boucle sur les éléments dans le vecteur, et les éléments sont des matrices

D'abord, je construis 2 matrices, et construisons un vecteur, dont les entrées sont ces matrices. Ensuite, j'essaie de faire une boucle sur les éléments du vecteur, c'est-à-dire les matrices. Cependant, quand je le fais, j'obtiens une erreur "argument de longueur zéro".

cam <- 1:12 
ped <- 13:24 

dim(cam) <- c(3,4) 
dim(ped) <- c(4,3) 

mats <- c('cam','ped') 

for (i in 1:2) { 
    rownames(mats[i]) <- LETTERS[1:dim(mats[i])[1]] 
    colnames(mats[i]) <- LETTERS[1:dim(mats[i])[2]] 
} 

Le texte d'erreur est la suivante:

Error in 1:dim(mats[i])[1] : argument of length 0 

La question: comment faire une boucle sur les éléments d'un vecteur, ces éléments étant des matrices? (Je devine que je n'appelle pas les éléments correctement). Merci pour votre patience.

Répondre

2

Le go-to option R est d'utiliser des listes:

cam <- 1:12 ; dim(cam) <- c(3,4) 
# same as matrix(1:12, nrow = 3, ncol = 4) 
ped <- 13:24 ; dim(ped) <- c(4,3) 

# save the list ('=' sign for naming purposes only here) 
mats <- list(cam = cam, ped = ped) 

# notice the double brackets '[[' which is used for picking the list 
for (i in 1:length(mats) { 
    rownames(mats[[i]]) <- LETTERS[1:dim(mats[[i]])[1]] 
    colnames(mats[[i]]) <- LETTERS[1:dim(mats[[i]])[2]] 
} 

# finally you can call the whole list at once as follows: 
mats 
# or seperately using $ or [[ 
mats$cam # mats[['cam']] 
mats$ped # mats[['ped']] 

ALTERNATIVE

Si vous voulez vraiment devenir fou, vous pouvez profiter des fonctions get() et assign(). get() appelle un objet par caractère et assign() peut en créer un.

mats <- c('cam','ped') 
mats.new <- NULL # initialize a matrix placeholder 
for (i in 1:length(mats)) { 
    mats.new <- get(mats[i]) # save as a new matrix each loop 
    # use dimnames with a list input to do both the row and column at once 
    dimnames(mats.new) <- list(LETTERS[1:dim(mats.new)[1]], 
          LETTERS[1:dim(mats.new)[2]]) 
    assign(mats[i],mats.new) # create (re-write) the matrix 
} 
+0

Pourquoi expliquez-vous même assign/get? Personne ne devrait l'utiliser mais surtout pas un débutant. – Roland

1

Si les jeux de données sont placés dans un list nous pouvons utiliser lapply

lst <- lapply(mget(mats), function(x) { 
     dimnames(x) <- list(LETTERS[seq_len(nrow(x))], LETTERS[seq_len(ncol(x))]) 
    x}) 

Il est préférable de le garder dans un list. Au cas où les objets originaux doivent être changés

list2env(lst, envir = .GlobalEnv)