2016-04-18 11 views
-1

Ich versuche, einige Daten aus dem Internet herunterzuladen und es gibt Daten über eine Reihe von Tabellen über eine Reihe von Jahren ... Ich kann die Verbindung herstellen und herunterladen verschiedene Tabellen pro Jahr, aber es ist manuell in der Ausführung des Skripts pro Jahr.R Programmierung ... For Loop auf einen Datenrahmen zu schreiben

Ich habe eine for-Schleife eingerichtet, um über die Jahre zu iterieren und es in einen Datenrahmen zu schreiben, jedoch jedes Mal, wenn es eine Schleife gibt, überschreibt es die alten Daten.

Ich habe versucht, eine Variable mit Paste() einzurichten, aber es wird nicht funktionieren, ich habe mich gefragt, ob es eine Lösung für das, was ich frage. Hier

ist der Code, ich verwende ...

for(year in 2000:2010) 
{ 
    url_team <- "x" 
    team <- 'x' 
    url <- paste(
     "http://www.ab.com/team/",url_team,"/",year,".htm", sep="") 
    table <- readHTMLTable(url, stringsAsFactors = FALSE) 
} 
+1

Sie müssen kombinieren Sie 'paste' und' assign'. So etwas wie 'assign (paste0 (" table_ ", year), readHTMLTable (url, stringsAsFactors = F))'. Aber Sie sollten die Tabellen besser in einer Liste speichern und dann diese Liste in einen Datenrahmen umwandeln. – brittenb

+0

Tolles Zeug! Vielen Dank, das hat funktioniert. Für das Speichern als eine Liste werde ich schauen, wie man das macht. – antimuon

+1

Großartig! Wie ich schon sagte, für solche Sachen ist es besser, eine Liste zu erstellen und die Liste auszufüllen. Auf diese Weise haben Sie nur eine Variable in Ihrem Arbeitsbereich anstelle von 10. Ich schreibe unten eine Antwort in beide Richtungen, damit Sie die Frage akzeptieren und schließen können. – brittenb

Antwort

1

Eine Möglichkeit, dies zu tun, ist die assign Funktion mit der paste Funktion zu verwenden. Das würde wie folgt aussehen:

for (year in 2000:2010) { 
    url_team <- "x" 
    team <- 'x' 
    # paste0 automatically sets the sep argument to "" 
    url <- paste0("http://www.ab.com/team/", url_team, "/", year, ".htm") 
    assign(paste0("table_", year), readHTMLTable(url, stringsAsFactors=F)) 
} 

assign neue Variablen erstellen basierend auf dem Namen, den Sie es passieren. Der Nachteil ist, dass Sie jetzt 11 Variablen in Ihrem Arbeitsbereich haben, die einfach alles überladen. Stattdessen sollten Sie nur ein Listenobjekt verwenden, um alles an einem Ort zu halten. Das würde so aussehen:

tables = vector(mode="list", length=11) 
for (i in 1:11) { 
    year <- 1999 + i 
    url_team <- "x" 
    team <- 'x' 
    url <- paste0("http://www.ab.com/team/", url_team, "/", year, ".htm") 
    tables[[i]] <- readHTMLTable(url, stringsAsFactors=F) 
} 
names(tables) <- as.character(2000:2010) 

Jetzt können Sie jede Tabelle aufrufen, indem tables$2000 oder tables$2003 oder dergleichen verwendet wird. Am Ende haben Sie alle 11 Tabellen, aber nur eine Variable.

+0

Danke, das scheint bis zu einem gewissen Punkt zu funktionieren, erstellt die Tabellen als Tabellen $ 2000, Tabellen $ 2001, etc., aber alle Tabellen enthalten die Daten des letzten Wertes des Jahres, so scheint das gleiche wie mein ursprüngliches Problem zu tun . Ich habe versucht, Ihre ursprüngliche Lösung zusammenzuführen, aber es überschreibt immer noch die Daten. – antimuon

+0

@antimuon Ich bin mir nicht sicher, warum es so wäre. Es sei denn, es gibt etwas mit der URL und 'readHTMLTable' greift immer wieder auf dieselben Daten zu. Ich kann den Fehler nicht replizieren, da ich die tatsächliche URL, die Sie verwenden möchten, nicht kenne. – brittenb

+0

@brittenb ... mein Schlechter, ich entdeckte einen Tippfehler in dem, was ich tat, ich fand heraus, dass das variable Jahr nicht eingestellt wurde, also schaute ich genauer hin, ich hatte Jahr <1999 + ich, nicht Jahr <- 1999 + ich ...funktioniert super! Danke vielmals. – antimuon

2

Verwenden Sie für eine Liste von Datenrahmen aus den HTML-Tabellen. Und dann ein do.call(rbind, ...) laufen alle Datenrahmen in einem Master-Datenrahmen zu binden:

dflist <- lapply(2000:2010, function(year){ 
       url_team <- "x" 
       team <- 'x' 
       url <- paste0("http://www.ab.com/team/",url_team,"/",year,".htm") 
       readHTMLTable(url, stringsAsFactors = FALSE) 
      }) 

finaldf <- do.call(rbind, dflist) 
0

Try this:

library(dplyr) 

data_frame(url_team = "x", 
      team = "x", 
      year = 2000:2010) %>% 
    mutate(url = paste0("http://www.ab.com/team/", 
        url_team,"/",year,".htm")) %>% 
    group_by(year, team) %>% 
    do(readHTMLTable(.$url, stringsAsFactors = FALSE)) 

Auch wenn Sie mehrere Teams haben:

team = data_frame(team = c("x", "y"), 
        url_team = c("x", "y")) 
year = data_frame(year = 2000:2010) 

merge(year, team) %>% 
    mutate(url = paste("http://www.ab.com/team/", 
        url_team,"/",year,".htm", sep="")) %>% 
    group_by(year, team) %>% 
    do(readHTMLTable(.$url, stringsAsFactors = FALSE)) 
+0

Es gibt einen Typ, der nur daran interessiert ist, legitime Lösungen zu verwerfen. Wenn Sie mehr darüber erfahren möchten, werfen Sie einen Blick auf [hier] (http://stackoverflow.com/questions/36694028/extracting-words-from-a-string-in-r/36694077#36694077).Es ist eine legitime Lösung, wurde aber downvoted, weil der Typ dachte "Stringi" -Lösung ist zu schwer zu verstehen :-). Wie auch immer, plus eins. – akrun

+0

@ Bramtayl, danke. Ich habe das ausprobiert und es erzeugt eine Matrixausgabe von Jahr, Team und Tisch, aber ich kann nicht auf den Tisch zugreifen ... Ich werde es später noch einmal versuchen, wenn ich eine Chance bekomme. – antimuon