2017-04-27 9 views
1

Ich habe einen Datenrahmen, der mehrere Spalten und Zeilen hat - einige enthalten Informationen, einige sind mit NA gefüllt, die mit bestimmten Daten ersetzt werden sollten.Sammeln von Daten mit R - mehrere URLs

Die Zeilen repräsentieren spezifische Instrumente und Spalten enthalten verschiedene Details des Instruments in einer bestimmten Zeile. Die letzte Spalte des Datenrahmen hat eine URL für jedes Instrument, das dann verwendet wird, um Daten für leere Spalten zu greifen:

Issuer NIN or ISIN   Type Nominal Value # of Bonds Issue Volume Start Date End Date 
1 NBRK KZW1KD079112 discount notes   NA   NA   NA   NA  NA 
2 NBRK KZW1KD079146 discount notes   NA   NA   NA   NA  NA 
3 NBRK KZW1KD079153 discount notes   NA   NA   NA   NA  NA 
4 NBRK KZW1KD089137 discount notes   NA   NA   NA   NA  NA 

URL 
1 http://www.kase.kz/en/gsecs/show/NTK007_1911 
2 http://www.kase.kz/en/gsecs/show/NTK007_1914 
3 http://www.kase.kz/en/gsecs/show/NTK007_1915 
4 http://www.kase.kz/en/gsecs/show/NTK008_1913 

Zum Beispiel mit dem folgenden Code erhalte ich die Details für das erste Instrument in der Reihe NBRK KZW1KD079112:

sp = readHTMLTable(newd$URL[[1]]) 
sp[[4]] 

Welche der folgenden gibt:

          V1                

    V2 
1          Trading code               NTK007_1911 
2        List of securities               official 
3        System of quotation                price 
4        Unit of quotation         nominal value percentage fraction 
5        Quotation currency                 KZT 
6        Quotation accuracy              4 characters 
7      Trade lists admission date               04/21/17 
8        Trade opening date               04/24/17 
9      Trade lists exclusion date               04/28/17 
10          Security                <NA> 
11          Bond's name short-term notes of the National Bank of the Republic of Kazakhstan 
12           NSIN              KZW1KD079112 
13     Currency of issue and service                 KZT 
14    Nominal value in issue's currency                100.00 
15      Number of registered bonds              1,929,319,196 
16      Number of bonds outstanding              1,929,319,196 
17        Issue volume, KZT              192,931,919,600 
18 Settlement basis (days in month/days in year)              actual/365 
19      Date of circulation start               04/21/17 
20       Circulation term, days                 7 
21    Register fixation date at maturity               04/27/17 
22      Principal repayment date               04/28/17 
23         Paying agent       Central securities depository JSC (Almaty) 
24          Registrar       Central securities depository JSC (Almaty) 

Daraus werde ich nur halten haben:

14    Nominal value in issue's currency                100.00 
16      Number of bonds outstanding              1,929,319,196 
17        Issue volume, KZT              192,931,919,600 
19      Date of circulation start               04/21/17 
22      Principal repayment date               04/28/17 

Ich werde dann die benötigten Daten in den ursprünglichen Datenrahmen kopieren und mit der nächsten Zeile fortfahren ... Der Datenrahmen besteht aus mehr als 100 Zeilen und wird sich ständig ändern.

Ich würde jede Hilfe zu schätzen wissen.

UPDATE:

Sieht aus wie die Daten, die ich nicht immer in sp[[4]] müssen. Manchmal ist es , vielleicht in der Zukunft wird es völlig andere Tabelle sein. Gibt es eine Möglichkeit, die für die Informationen in den Tabellen geschabt und identifiziert eine bestimmte Tabelle sucht, die weiter verwendet werden könnten, um Daten zu sammeln ?:

sp = readHTMLTable(newd$URL[[1]]) 
sp[[4]] 

Antwort

1
library(XML) 
library(reshape2) 
library(dplyr) 

name = c(
"NBRK KZW1KD079112 discount notes",           
"NBRK KZW1KD079146 discount notes",           
"NBRK KZW1KD079153 discount notes",           
"NBRK KZW1KD089137 discount notes")           

URL = c(
"http://www.kase.kz/en/gsecs/show/NTK007_1911", 
"http://www.kase.kz/en/gsecs/show/NTK007_1914", 
"http://www.kase.kz/en/gsecs/show/NTK007_1915", 
"http://www.kase.kz/en/gsecs/show/NTK008_1913") 

# data 
instruments <- data.frame(name, URL, stringsAsFactors = FALSE) 

# define the columns wanted and the mapping to desired name 
# extend to all wanted columns 
wanted <- c("Nominal value in issue's currency" = "Nominal Value", 
      "Number of bonds outstanding" = "# of Bonds Issue") 

# function returns a data frame of wanted columns for given URL 
getValues <- function (name, url) { 
    # get the table and rename columns 
    sp = readHTMLTable(url, stringsAsFactors = FALSE) 
    df <- sp[[4]] 
    names(df) <- c("full_name", "value") 

    # filter and remap wanted columns 
    result <- df[df$full_name %in% names(wanted),] 
    result$column_name <- sapply(result$full_name, function(x) {wanted[[x]]}) 

    # add the identifier to every row 
    result$name <- name 
    return (result[,c("name", "column_name", "value")]) 
} 

# invoke function for each name/URL pair - returns list of data frames 
columns <- apply(instruments[,c("name", "URL")], 1, function(x) {getValues(x[["name"]], x[["URL"]])}) 

# bind using dplyr:bind_rows to make a tall data frame 
tall <- bind_rows(columns) 

# make wide using dcast from reshape2 
wide <- dcast(tall, name ~ column_name, id.vars = "value") 

wide 

#        name # of Bonds Issue Nominal Value 
# 1 NBRK KZW1KD079112 discount notes 1,929,319,196  100.00 
# 2 NBRK KZW1KD079146 discount notes 1,575,000,000  100.00 
# 3 NBRK KZW1KD079153 discount notes  701,390,693  100.00 
# 4 NBRK KZW1KD089137 discount notes 1,380,368,000  100.00 

    enter code here 
+0

Vielen Dank. Ihr Code funktioniert, aber wenn ich versuche, ihn für alle Instrumente auszuführen, erhalte ich den folgenden Fehler: 'Fehler in' $ <-. Data.frame' ('* tmp *', "name", value = " KZW1KD919127 "): Ersatz hat 1 Zeile, Daten 0 ' Irgendwelche Ideen, warum das passiert? – AK88

+0

Hmmm ... Ich habe gerade dieses spezielle Instrument untersucht und festgestellt, dass die Daten, die ich brauche, nicht in 'sp [[4]]', sondern 'sp [[7]]' enthalten sind. Ist es irgendwie möglich, diese Bedingung dort einzubauen? – AK88

+1

Der nicht so nette Hack ist etwas wie 'df <- if_else (name ==" foo ", sp [[4]], sp [[7]])'. Ich bevorzuge generell die 'dplyr if_else' und nicht die Basis' ifelse', weil die Klasse beibehalten wird. Besserer Ansatz ist es zu lernen, 'library (rvest)' zu verwenden, da es CSS-Selektoren in der 'html_nodes' -Funktion unterstützt, die auf die 'id'-Attribute im HTML-Code zielen können anstatt auf Position – epi99