2016-12-14 2 views
0

J'ai une liste qui ressemble à celui ci-dessous:liste Transforming obtenu par StrSplit fusionner des catégories communes

# Initial object 
vec <- c("levelA-1", "levelA-2", "levelA-3", 
     "levelB-1", "levelB-2", "levelB-3") 
lstVec <- strsplit(x = vec, split = "-") 

Je voudrais arriver à une liste de la structure suivante:

lstRes <- list(levelA = list(1:3), 
       lvelB = list(1:3)) 

Notes de

La liste a les caractéristiques suivantes:

  • éléments de premier niveau sont transformées en listes distinctes
  • éléments de second niveau créés par strsplit sont des éléments de ces listes

Répondre

5

ce SUFFIT:

mat <- do.call(rbind, lstVec)  
result <- split(mat[,2], mat[,1]) 

la do.call et rbind pile le résultat de lstVec par rangée dans une matrice (grâce à G. Grothendieck pour souligner que ce n'est pas une trame de données), puis le split divisé mat[,2] par mat[,1]. Comme le dit Aaron, il est un peu étrange que vous vouliez une liste imbriquée. mais vous pouvez l'obtenir

lapply(result, as.list) 

Je ne sais pas à quel point rbind est. mais une autre façon d'obtenir mat est

mat <- matrix(unlist(lstVec), ncol = 2, byrow = TRUE) 
+0

Pour avoir chaque élément dans les listes (qui ne peut pas réellement être ce que l'OP veut, il est un peu bizarre), vous aurez également convertir chaque élément à une liste avec lapply . – Aaron

+1

Il est également utile d'ajouter un petit commentaire expliquant ce que cela fait. Bienvenue à SO! – Aaron