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?
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).
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
...
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
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)