web-dev-qa-db-fra.com

Extraire les sorties de lapply vers un dataframe

J'ai du code R qui effectue une opération d'extraction de données sur tous les fichiers du répertoire en cours, en utilisant le code suivant:

files <- list.files(".", pattern="*.tts")
results <- lapply(files, data_for_time, "17/06/2006 12:00:00")

Le résultat de lapply est le suivant (extrait à l'aide de dput()) - en gros une liste complète de vecteurs:

list(c("amer", "14.5"), c("appl", "14.2"), c("brec", "13.1"), 
c("camb", "13.5"), c("camo", "30.1"), c("cari", "13.8"), 
c("chio", "21.1"), c("dung", "9.4"), c("east", "11.8"), c("exmo", 
"12.1"), c("farb", "14.7"), c("hard", "15.6"), c("herm", 
"24.3"), c("hero", "13.3"), c("hert", "11.8"), c("hung", 
"26"), c("lizr", "14"), c("maid", "30.4"), c("mart", "8.8"
), c("newb", "14.7"), c("newl", "14.3"), c("oxfr", "13.9"
), c("padt", "10.3"), c("pbil", "13.6"), c("pmtg", "11.1"
), c("pmth", "11.7"), c("pool", "14.6"), c("prae", "11.9"
), c("ral2", "12.2"), c("sano", "15.3"), c("scil", "36.2"
), c("sham", "12.9"), c("stra", "30.9"), c("stro", "14.7"
), c("taut", "13.7"), c("tedd", "22.3"), c("wari", "12.7"
), c("weiw", "13.6"), c("weyb", "8.4"))

Cependant, je souhaiterais traiter cette sortie sous forme de structure de données à deux colonnes: une pour le code alphabétique ("amer", "appl", etc.) et une pour le nombre (14.5, 14.2, etc.).

Malheureusement, as.data.frame ne semble pas fonctionner avec cette entrée de vecteurs imbriqués dans une liste. Comment dois-je m'y prendre pour convertir cela? Dois-je changer la façon dont ma fonction data_for_time renvoie ses valeurs? Pour le moment, il retourne simplement c(name, value). Ou existe-t-il un bon moyen de convertir ce type de sortie en un cadre de données?

16
robintw

Une option pourrait consister à utiliser la fonction ldply du package plyr , qui assemblera les éléments dans un cadre de données pour vous.

Un exemple trivial de son utilisation:

ldply(1:10,.fun = function(x){c(runif(1),"a")})
                    V1 V2
1    0.406373084755614  a
2    0.456838687881827  a
3    0.681300171650946  a
4    0.294320539338514  a
5    0.811559669673443  a
6    0.340881009353325  a
7    0.134072444401681  a
8  0.00850683846510947  a
9    0.326008745934814  a
10    0.90791508089751  a

Mais notez que si vous mélangez des types de variable avec c(), vous aurez probablement vouloirmodifier votre fonction pour renvoyer simplement data.frame(name= name,value = value) au lieu de c(name,value). Sinon, tout sera forcé à caractère (comme dans l'exemple ci-dessus).

9
joran

Essayez ceci si results était votre liste:

> as.data.frame(do.call(rbind, results))

     V1   V2
1  amer 14.5
2  appl 14.2
3  brec 13.1
4  camb 13.5
...
38
fotNelton
inp <- list(c("amer", "14.5"), c("appl", "14.2"), .... # did not see need to copy all

data.frame( first= sapply( inp, "[", 1), 
            second =as.numeric( sapply( inp, "[", 2) ) )

   first second
1   amer   14.5
2   appl   14.2
3   brec   13.1
4   camb   13.5
5   camo   30.1
6   cari   13.8
snipped output
3
42-

Parce que pour etNelton a pris la réponse que j'étais en train de donner et Joran a pris la seule autre réponse raisonnable à laquelle je pouvais penser et étant donné que je suis censé écrire un article, voici une réponse ridicule:

#I named your list LIST
LIST2 <-  LIST[[1]]
lapply(2:length(LIST), function(i) {LIST2 <<- rbind(LIST2, LIST[[i]])})
data.frame(LIST2)
1
Tyler Rinker