2016-04-08 8 views
0

Ich habe einen Dump von einer Datenbank in Form einer HTML-Tabelle. Mein Problem ist, dass es Komma als Dezimalzeichen verwendet und ich kann nicht lesenHTMLTable, um es richtig zu behandeln. Die Werte enden als Faktor anstelle von numerisch. Dies könnte extern gelöst werden, aber ich würde es gerne in R.Lesen von Daten mit Dezimal Komma mit readHTMLTable

Ich habe versucht, dec="," in der Hoffnung, dass die Elipsis würde es in der Ausführungsleitung übergeben, aber es hat nicht funktioniert.

Next trest wurde von der Hilfe für readHTMLTable inspiriert habe ich versucht, elFun

library(XML) 
tryAsNumeric <- function(node) { 
    val = xmlValue(node) 
    ans = as.numeric(gsub(",", ".", val)) 
    if(is.numeric(ans)) 
    ans 
    else 
    val 
} 

tmp_list <- readHTMLTable("teeChart.xls", elFun = tryAsNumeric) 

mit und endete mit dieser Nachricht

There were 50 or more warnings (use warnings() to see the first 50) 
> warnings() 

Warning messages: 

1: In (function (node) ... : NAs introduced by coercion 
2: In (function (node) ... : NAs introduced by coercion 
3: In (function (node) ... : NAs introduced by coercion 
4: In (function (node) ... : NAs introduced by coercion 

Verkürzte Liste der Kürze.

Hier ist eine reduzierte Tabelle für die Reproduzierbarkeit. (TeeChart.xls)

<table border="1"> 
<tr><td></td><td>Lägenhet 053</td><td></td><td>Lägenhet 054</td><td></td><td>Lägenhet 055</td><td></td></tr> 
<tr><td>Index</td><td>X</td><td>Y</td><td>X</td><td>Y</td><td>X</td><td>Y</td></tr> 
<tr><td>0</td><td>42309</td><td>20,8249988555908</td><td>42309</td><td>20,2000007629395</td><td>42309</td><td>22,2000007629395</td></tr> 
<tr><td>1</td><td>42309,0416666667</td><td>20,7000007629395</td><td>42309,0416666667</td><td>20,2000007629395</td><td>42309,0416666667</td><td>22,125</td></tr> 
<tr><td>2</td><td>42309,0833333333</td><td>20,6000003814697</td><td>42309,0833333333</td><td>20,2000007629395</td><td>42309,0833333333</td><td>22,0249996185303</td></tr> 
</table> 

Antwort

0

Set colClasses? Auch von der Hilfe ?readHTMLTable:

library(XML) 
tryAsNumeric <- function(node) { 
    val = xmlValue(node) 
    ans = as.numeric(gsub(",", ".", val)) 
    if(all(is.numeric(ans))) 
    ans 
    else 
    val 
} 
txt <- readLines(n=7) 
<table border="1"> 
<tr><td></td><td>Lägenhet 053</td><td></td><td>Lägenhet 054</td><td></td><td>Lägenhet 055</td><td></td></tr> 
<tr><td>Index</td><td>X</td><td>Y</td><td>X</td><td>Y</td><td>X</td><td>Y</td></tr> 
<tr><td>0</td><td>42309</td><td>20,8249988555908</td><td>42309</td><td>20,2000007629395</td><td>42309</td><td>22,2000007629395</td></tr> 
<tr><td>1</td><td>42309,0416666667</td><td>20,7000007629395</td><td>42309,0416666667</td><td>20,2000007629395</td><td>42309,0416666667</td><td>22,125</td></tr> 
<tr><td>2</td><td>42309,0833333333</td><td>20,6000003814697</td><td>42309,0833333333</td><td>20,2000007629395</td><td>42309,0833333333</td><td>22,0249996185303</td></tr> 
</table> 
doc <- htmlParse(txt, asText=TRUE) 
(res <- readHTMLTable(doc, elFun = tryAsNumeric, colClasses = rep("numeric", 7))) 
# $`NULL` 
# NA  NA  NA  NA NA  NA  NA 
# 1 NA  NA  NA  NA NA  NA  NA 
# 2 0 42309.00 20.825 42309.00 20.2 42309.00 22.200 
# 3 1 42309.04 20.700 42309.04 20.2 42309.04 22.125 
# 4 2 42309.08 20.600 42309.08 20.2 42309.08 22.025 

str(res) 
# List of 1 
# $ NULL:'data.frame': 4 obs. of 7 variables: 
# ..$ NA: num [1:4] NA 0 1 2 
# ..$ NA: num [1:4] NA 42309 42309 42309 
# ..$ NA: num [1:4] NA 20.8 20.7 20.6 
# ..$ NA: num [1:4] NA 42309 42309 42309 
# ..$ NA: num [1:4] NA 20.2 20.2 20.2 
# ..$ NA: num [1:4] NA 42309 42309 42309 
# ..$ NA: num [1:4] NA 22.2 22.1 22 

library(XML) 
txt <- readLines(n=7) 
<table border="1"> 
<tr><td></td><td>Lägenhet 053</td><td></td><td>Lägenhet 054</td><td></td><td>Lägenhet 055</td><td></td></tr> 
<tr><td>Index</td><td>X</td><td>Y</td><td>X</td><td>Y</td><td>X</td><td>Y</td></tr> 
<tr><td>0</td><td>42309</td><td>20,8249988555908</td><td>42309</td><td>20,2000007629395</td><td>42309</td><td>22,2000007629395</td></tr> 
<tr><td>1</td><td>42309,0416666667</td><td>20,7000007629395</td><td>42309,0416666667</td><td>20,2000007629395</td><td>42309,0416666667</td><td>22,125</td></tr> 
<tr><td>2</td><td>42309,0833333333</td><td>20,6000003814697</td><td>42309,0833333333</td><td>20,2000007629395</td><td>42309,0833333333</td><td>22,0249996185303</td></tr> 
</table> 
doc <- htmlParse(txt) 
m <- as.matrix(readHTMLTable(doc, which=1)) 
colnames(m) <- m[1,] 
m <- m[-1, ] 
m <- gsub(",", ".", m) 
as.data.frame(structure(as.numeric(m), .Dim=dim(m), .Dimnames = dimnames(m))) 
# Index  X  Y  X Y  X  Y 
# 1  0 42309.00 20.825 42309.00 20.2 42309.00 22.200 
# 2  1 42309.04 20.700 42309.04 20.2 42309.04 22.125 
# 3  2 42309.08 20.600 42309.08 20.2 42309.08 22.025 
+0

colClasses scheint das Problem mit numerischen vs Faktor zu lösen. Trotzdem bekomme ich all diese Warnungen über die Einführung von NA in Zwang. Ich kenne auch nicht die Anzahl der Variablen für den Rep in der gesamten Datenbank. –

+0

Imho vergessen Sie 'readHTMLTable' und tun Sie es" Old School "- siehe meine Bearbeitung. – lukeA