2016-05-22 11 views
1

Ich versuche, die Namen von Listenelementen zu nehmen und verwenden Sie do(), um eine Funktion über alle anzuwenden, dann binden Sie sie in einem einzigen Datenrahmen.Verwendung von do() mit Namen von Listenelementen

require(XML) 
require(magrittr) 

url <- "http://gd2.mlb.com/components/game/mlb/year_2016/month_05/day_21/gid_2016_05_21_milmlb_nynmlb_1/boxscore.xml" 

box <- xmlParse(url) 

xml_data <- xmlToList(box) 

end <- length(xml_data[[2]]) - 1 

x <- seq(1:end) 

away_pitchers_names <- paste0("xml_data[[2]][", x, "]") 
away_pitchers_names <- as.data.frame(away_pitchers_names) 
names(away_pitchers_names) <- "elements" 
away_pitchers_names$elements %<>% as.character() 

listTodf <- function(x) { 
    df <- as.data.frame(x) 
    tdf <- as.data.frame(t(df)) 
    row.names(tdf) <- NULL 
    tdf 
} 

test <- away_pitchers_names %>% group_by(elements) %>% do(listTodf(.$elements)) 

Wenn ich die listTodf Funktion auf einem Listenelement laufen funktioniert es gut:

listTodf(xml_data[[2]][1] 

     id name name_display_first_last pos out bf er r h so hr bb np s w l sv bs hld s_ip s_h s_r s_er s_bb 
1 605200 Davies    Zach Davies P 16 22 4 4 5 5 2 2 86 51 1 3 0 0 0 36.0 41 24 23 15 
    s_so game_score era 
1 25   45 5.75 

Aber wenn ich eine Schleife durch die Namen der Elemente mit dem do() Funktion versuchen, erhalte ich die folgende :

Warning message: In rbind_all(out[[1]]) : Unequal factor levels: coercing to character

Und hier ist die Ausgabe:

Ich bin mir sicher, dass es etwas sehr einfaches ist, aber ich kann nicht herausfinden, wo die Dinge stolpern.

+0

Können Sie erklären, warum Sie die Gruppenvariable sind zur Umsetzung der von der gleichen Variable gruppieren und dann das Ganze als data.frame kombinieren? Bitte erläutern Sie, was genau Sie mit einem [minimal reproduzierbaren Beispiel] tun möchten (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – shreyasgm

+0

Jedes Element der Liste hat die gleichen Variablen, sie repräsentieren nur verschiedene Fälle. Also versuche ich, jedes Element zu nehmen, kombiniere es und zeige es dann in breiter Form an (seit das Umwandeln eines Listenelements in einen Datenrahmen in langer Form angezeigt wird). – BillPetti

+0

Wenn Sie die Zeichenfolgen auswerten, verwenden Sie 'eval (parse (..' dh 'lapply (away_pitchers_names $ elements, function (x) listTodf (eval (parse (text = x)))) Beachten Sie auch, dass in der listTodf' function '' as.data.frame' 'wird ohne 'stringsAsFactors = FALSE' aufgerufen, so dass alle Zeichenspalten standardmäßig' factor' Klasse sind, was zu der in Ihrem Post erwähnten Warnung führt. – akrun

Antwort

1

Für die Saiten Auswertung kann eval(parse

library(dplyr) 
lapply(away_pitchers_names$elements, 
     function(x) as.data.frame.list(eval(parse(text=x))[[1]], stringsAsFactors=FALSE)) %>% 
       bind_rows() 
#  id  name name_display_first_last pos out bf er r h so hr bb np s w l 
#1 605200 Davies    Zach Davies P 16 22 4 4 5 5 2 2 86 51 1 3 
#2 430641  Boyer   Blaine Boyer P 2 4 0 0 2 0 0 0 8 7 1 0 
#3 448614 Torres, C   Carlos Torres P 3 4 0 0 0 1 0 2 21 11 0 1 
#4 592804 Thornburg   Tyler Thornburg P 3 3 0 0 0 1 0 0 14 8 2 1 
#5 518468 Blazek   Michael Blazek P 1 5 1 1 2 0 0 2 23 10 1 1 
# sv bs hld s_ip s_h s_r s_er s_bb s_so game_score era loss  note 
#1 0 0 0 36.0 41 24 23 15 25   45 5.75 <NA>  <NA> 
#2 0 1 0 21.1 22 4 4 5 7   48 1.69 <NA>  <NA> 
#3 0 0 2 22.1 22 9 9 14 21   52 3.63 <NA>  <NA> 
#4 1 2 8 18.2 13 8 8 7 29   54 3.86 <NA>  <NA> 
#5 0 1 8 21.1 23 6 6 14 18   41 2.53 true (L, 1-1) 

jedoch verwendet werden, ist es einfacher und schneller zu nur tun

lapply(xml_data[[2]][1:5], function(x) 
     as.data.frame.list(x, stringsAsFactors=FALSE)) %>% 
        bind_rows() 
+1

Genau das war ich Nach etwas suchen, dachte darüber nach dem falschen Weg. – BillPetti

Verwandte Themen