2010-05-13 7 views
0

J'essaie de créer une liste vide qui aura autant d'éléments qu'il y a num.of.walkers. J'essaie alors d'ajouter, à chaque élément créé, une nouvelle sous-liste (longueur de la nouvelle sous-liste correspond à une valeur aen essayant d'ajouter une liste, mais quelque chose se brise

Quand je bricoler en R tout se passe bien.

list.of.dist[[1]] <- vector("list", a[1]) 
list.of.dist[[2]] <- vector("list", a[2]) 
list.of.dist[[3]] <- vector("list", a[3]) 
list.of.dist[[4]] <- vector("list", a[4]) 
..?

J'essaie alors d'écrire une fonction Voici ma faible tentative qui se traduit par une erreur puce quelqu'un peut-il dans ce que je fais mal

countNumberOfWalks <- function(walk.df) { 
    list.of.walkers <- sort(unique(walk.df$label)) 
    num.of.walkers <- length(unique(walk.df$label)) 

    #Pre-allocate objects for further manipulation 
    list.of.dist <- vector("list", num.of.walkers) 
    a <- c() 

    # Count the number of walks per walker. 
    for (i in list.of.walkers) { 
     a[i] <- nrow(walk.df[walk.df$label == i,]) 
    } 
    a <- as.vector(a) 

    # Add a sublist (length = number of walks) for each walker. 
    for (i in i:num.of.walkers) { 
     list.of.dist[[i]] <- vector("list", a[i]) 
    } 
    return(list.of.dist) 
} 

> num.of.walks.per.walker <- countNumberOfWalks(walk.df) 
Error in vector("list", a[i]) : vector size cannot be NA 

Répondre

2

en supposant « walk.df » est quelque chose comme:

walk.df <- data.frame(label=sample(1:10,100,T),var2=1:100) 

alors:

countNumberOfWalks <- function(walk.df) { 
    list.of.walkers <- sort(unique(walk.df$label)) 
    num.of.walkers <- length(unique(walk.df$label)) 

    list.of.dist <- vector("list", num.of.walkers) 

    for (i in 1:num.of.walkers) { 
     list.of.dist[[i]] <- vector("list", 
     nrow(walk.df[walk.df$label == list.of.walkers[i],]))} 

    return(list.of.dist) 
} 

réaliserons ce que vous êtes après.

+0

L'utilisation de length() dans la boucle for() doit être remplacée par nrow(), mais à part ça - parfait! –

+0

Je suis curieux de savoir pourquoi ma solution n'a pas fonctionné, est-ce que quelqu'un sait? Pour répondre à votre question concernant la validité de la création d'une liste de listes, je souhaite pré-allouer une liste vide qui sera utilisée pour accueillir les objets RasterLayer. Je pense que c'est un peu plus élégant que de créer des objets avec deparse(). –

+0

@romunov. OK très bien. – wkmor1

Questions connexes