2016-04-08 7 views
0

データベースのダンプをHTMLテーブルの形式で持っています。 私の問題は、小数点文字としてカンマを使用し、正しく処理するためにreadHTMLTableを取得できないということです。値は数値ではなく因子として終わります。これは外部から解決することができますが、私はすべてRでそれをしたいと思います。readHTMLTableで10進数のカンマでデータを読み取る

私はを実行しようとしましたが、実行パイプの下を通過しても動作しないことを願っていました。

次のトレストは、私が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) 

を使用してみましたし、このメッセージ簡潔にするため

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 

切り捨てられたリストになってしまったreadHTMLTableのヘルプからインスピレーションを得ました。

ここには再現性のための縮小表があります。 (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> 

答えて

0

セットcolClasses?また、ヘルプ?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率対数値の問題を解決しているようです。それでも、私は強制的にNAの導入について警告します。また、データベース全体の担当者の変数数もわかりません。 –

+0

Imhoさんは 'readHTMLTable'を忘れて、「古い学校」にしています - 私の編集を見てください。 – lukeA

関連する問題