2017-10-21 1 views
0

J'ai une fonction qui vérifie ma liste. J'ai une liste avec deux vecteurs. Au lieu de répéter mon code, j'ai essayé d'utiliser la boucle for. Cependant, la boucle for ne fonctionne pas comme prévu.Pourquoi ma liste ne fonctionne pas

Voici mon code:

x <- c(2,3,4,5) 
y <- c(2,4,6,7) 
z <- list(x,y) 
pscale <- numeric() 
pscale <- list() 
for(i in 1:4){#length of my vector 
for(j in 1:2){#length of z 
pscale[[j]][[i]] <- ifelse(z[[j]][[i]] %in% c(2,9,10),0.01,1) 
} 
} 
Error in `*tmp*`[[j]] : subscript out of bounds 

Répondre

4

Cela devrait fonctionner.

x <- c(2,3,4,5) 
y <- c(2,4,6,7) 
z <- list(x,y) 
pscale <- list() 
length(pscale) <- 2 # set length to the number of vectors 
for(i in 1:4){#length of my vector 
    for(j in 1:2){#length of z 
    pscale[[j]][i] <- ifelse(z[[j]][i] %in% c(2,9,10),0.01,1) 
    } 
} 
+0

J'ai beaucoup de vecteurs et besoin de la fonction fonctionne automatiquement – Alice

+0

J'ai édité ma réponse. Si vous connaissez le nombre de vos vecteurs, définissez la longueur de la liste. – Glaud

3

Je suggère de déclarer pscale comme matrice:

x <- c(2,3,4,5) 
y <- c(2,4,6,7) 
z <- list(x,y) 
pscale <- matrix(rep(NA,length(x)*length(z)), length(z), length(x)) 
for(i in 1:4) { 
for(j in 1:2) { 
    pscale[j,i] <- ifelse(z[[j]][[i]] %in% c(2,9,10), 0.01, 1) 
} 
} 
pscale 

#  [,1] [,2] [,3] [,4] 
# [1,] 0.01 1 1 1 
# [2,] 0.01 1 1 1 

Sinon, définir pscale comme une liste:

x <- c(2,3,4,5) 
y <- c(2,4,6,7) 
z <- list(x,y) 
pscale <- vector(length(z), mode="list") 
for(i in 1:4) { 
for(j in 1:2) { 
    pscale[[j]][[i]] <- ifelse(z[[j]][[i]] %in% c(2,9,10), 0.01, 1) 
} 
} 
pscale 

# [[1]] 
# [1] 0.01 1.00 1.00 1.00 
# 
# [[2]] 
# [1] 0.01 1.00 1.00 1.00 
+0

Pourriez-vous expliquer ce que '2' signifie dans' vector (2, ..) '. Est-ce le nombre de mes vecteurs? – Alice

+2

@Alice Oui, '2' est le nombre de vecteurs:' x' et 'y'. Vous pouvez utiliser 'vector (length (z), mode =" list ")'. –