2014-07-12 2 views
1

Je développe a function that parses a nested list. Malheureusement, à cause de la nature des données brutes, il n'y a vraiment aucun moyen de le faire de cette façon. Les trois derniers bits du code dans la fonction me font un peu peur, mais ils font le travail. Ici, ils sont:Un moyen plus efficace d'analyser les éléments d'une liste imbriquée

mkList <- lapply(rec, function(x){ 
     lapply(regex, function(y) grep(y, x, value = TRUE)) }) 
rem <- lapply(mkList, function(x){ 
     lapply(x, function(y) sub("[a-z]+,", "", y)) }) 
lapply(rem, read.as.csv) 

Oui, vous voyez que correctement, il est 5 appels consécutifs à lapply. Et oui, vous l'aurez deviné, read.as.csv appelle aussi lapply


Pour faire un petit exemple reproductible, tenez compte de la liste imbriquée x et la suivante « double » lapply morceau. Le résultat est exactement ce que je veux, mais je suis curieux

Existe-t-il un moyen plus efficace d'appliquer une fonction à la liste interne d'une liste imbriquée?

Les éléments de liste interne sont des vecteurs csv de longueur de chaîne variable.

> (x <- list(list(a = c("a,b,c", "d,e,f"), 
        b = c("1,2,a,b,c,d", "3,4,e,f,g,h")))) 

# [[1]] 
# [[1]]$a 
# [1] "a,b,c" "d,e,f" 
# 
# [[1]]$b 
# [1] "1,2,a,b,c,d" "3,4,e,f,g,h" 

> lapply(x, function(y){ 
     lapply(y, function(z) do.call(rbind, strsplit(z, ","))) 
    }) 

# [[1]] 
# [[1]]$a 
#  [,1] [,2] [,3] 
# [1,] "a" "b" "c" 
# [2,] "d" "e" "f" 
# 
# [[1]]$b 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] "1" "2" "a" "b" "c" "d" 
# [2,] "3" "4" "e" "f" "g" "h" 
+2

Vous cherchez peut-être 'rapply' peut-être? 'rapply (x, fonction (y) do.call (rbind, strsplit (y,", ", VRAI)), how =" remplacer ")'. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto, vous devenez la raison pour laquelle je pose des questions tard dans la nuit. Haha –

Répondre

2

Parmi les fonctions les moins connues dans la famille *apply est rapply --pour « lapply récursive ». Il semble que vous essayez de faire:

rapply(x, function(y) do.call(rbind, strsplit(y, ",", TRUE)), how = "replace") 
# [[1]] 
# [[1]]$a 
#  [,1] [,2] [,3] 
# [1,] "a" "b" "c" 
# [2,] "d" "e" "f" 
# 
# [[1]]$b 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] "1" "2" "a" "b" "c" "d" 
# [2,] "3" "4" "e" "f" "g" "h" 

Pour cet exemple, il y a une ombre derrière votre approche, mais comme vous l'échelle l'exemple en place, il se révèle être plus efficace.

+0

Je vais leur donner un tourbillon à travers system.time. –

+0

Vous savez quoi, je passe deux variables. Dans le premier, 'rec' et' regex' vont tous les deux. Puis-je utiliser deux variables dans 'rapply' comme je peux dans' mapply'? Le fichier d'aide dit 'f' est une fonction d'une seule variable –

+0

@RichardScriven, non testée, mais n'est-ce pas ce que le' ... 'est dans' rapply'? (Il est défini comme * arguments supplémentaires passés à l'appel à 'f'. *) – A5C1D2H2I1M1N2O1R2T1

Questions connexes