2017-04-26 7 views
0

me pardonnera si cela a été demandé avant ...La combinaison de listes avec do.call tout en préservant chaque entrée de la liste sur une ligne

Je dispose de plusieurs listes que je veux combiner comme suit

A <- list(c("R", "L", "*", "T", "M", "S", "S", "S", "S", "Y"), 
    c("G", "A", "G", "P", "P", "V", "P"), 
    c("E", "G", "R", "E", "Q", "T", "K", "G", "S", "G"), 
    c("Y", "N", "N", "D", "W"), 
    c("T", "K")) 

B <- list(c("G", "T", "Q", "R"), 
    c("T", "G", "L", "W", "D", "Y", "*", "L", "Q", "H", "A", "P", "H", "L", "H", "L"), 
    c("E", "E", "D", "A", "G", "G", "R", "E", "D", "S", "I", "L", "V", "N", "G", "A", "T", "P", "\"", "\"", "C", "S", "D", "Q", "S", "S", "D", "S", "P", "P", "I", "L", "E", "A", "I", "R"), 
    c("S", "M", "C", "G", "*", "I", "K", "P"), 
    c("D", "S", "P")) 

C <- list(c("G", "L", "V", "L", "A", "H", "L", "R", "R", "L", "G"), 
    c("G", "S", "D", "T", "P", "V", "M", "P", "K", "L", "F"), 
    c("N", "W", "F", "E", "N", "T", "F", "D", "F", "R", "N", "K", "R", "C", "K", "*", "V"), 
    c("P", "A", "T", "R", "S", "L", "R", "R", "R", "A", "T", "A"), 
    c("I", "G", "F", "I", "P", "S", "P", "L", "R")) 

ce que je veux est ceci:

A   B          C 
RL*TMSSSSY GTQR         GLVLAHLRRLG 
GAGPPVP  TGLWDY*LQHAPHLHL      GSDTPVMPKLF 
EGREQTKGSG EEDAGGREDSILVNGATP""CSDQSSDSPPILEAIR NWFENTFDFRNKRCK*V 
YNNDW  SMCG*IKP        PATRSLRRRATA 
TK   DSP          IGFIPSPLR 

J'ai essayé ce qui suit, mais cela met tous les caractères de la liste sur une autre ligne qui équivaut à un nombre différent de lignes pour chaque liste:

do.call(cbind, list(A,B,C)) 

Existe-t-il un moyen d'obtenir ce que je veux?

Thx

Répondre

1

Si vous souhaitez utiliser tidyverse fonctions, vous pouvez faire

library(tidyverse) 
lst(A,B,C) %>% map_df(map_chr, paste, collapse="") 

La fonction lst() permet d'utiliser de faire une liste et de garder les noms de variables. Ensuite, nous map() sur les colonnes et, dans chaque colonne, map() sur la liste des vecteurs de caractères et de les réduire.

+0

Bonne approche. J'ai déjà essayé avec des cartes imbriquées, mais d'une manière ou d'une autre je n'ai pas pu le faire fonctionner. – akrun

0

Nous pouvons le faire avec un sapply imbriquée à boucle sur la list

m1 <- sapply(list(A, B, C), function(x) sapply(x, paste, collapse="")) 
setNames(as.data.frame(m1), LETTERS[1:3]) 
0

Voici une base méthode R.

data.frame(do.call(mapply, 
        list(function(x) sapply(x, paste, collapse=""), list(A=A, B=B, C=C)))) 

Ce retour

  A         B     C 
1 RL*TMSSSSY         GTQR  GLVLAHLRRLG 
2 GAGPPVP      TGLWDY*LQHAPHLHL  GSDTPVMPKLF 
3 EGREQTKGSG EEDAGGREDSILVNGATP""CSDQSSDSPPILEAIR NWFENTFDFRNKRCK*V 
4  YNNDW        SMCG*IKP  PATRSLRRRATA 
5   TK         DSP   IGFIPSPLR 

Ici, do.call applique Map. La liste dans la deuxième ligne sont les arguments de Map qui applique sapply sur la liste nommée des listes. sapply colle les vecteurs de chaque élément de liste et renvoie un vecteur.

Notes:

  1. cela est une tentative de reproduire les méthodes alexis-Laz m'a montré plus tôt here.
  2. J'ai initialement utilisé Map, mais mapply semble être environ 33% plus rapide (344ms vs 513ms) selon microbenchmark.