Xml 读取带有十进制逗号和readHTMLTable的数据

Xml 读取带有十进制逗号和readHTMLTable的数据,xml,r,Xml,R,我有一个以HTML表形式从数据库中转储的文件。 我的问题是它使用逗号作为十进制字符,我无法获得readHTMLTable来正确处理它。这些值最终作为因子而不是数字。这可以从外部解决,但我想在R中完成这一切 我试图传递dec=“,”,希望省略号能将其传递到执行管道中,但没有成功 下一个trest的灵感来自我尝试使用elFunreadHTMLTable的帮助 library(XML) tryAsNumeric <- function(node) { val = xmlValue(node)

我有一个以HTML表形式从数据库中转储的文件。 我的问题是它使用逗号作为十进制字符,我无法获得readHTMLTable来正确处理它。这些值最终作为因子而不是数字。这可以从外部解决,但我想在R中完成这一切

我试图传递
dec=“,”
,希望省略号能将其传递到执行管道中,但没有成功

下一个trest的灵感来自我尝试使用
elFun
readHTMLTable的帮助

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)
为简洁起见,截断了列表

这是一个关于再现性的简化表格。(teeChart.xls)


Lägenhet 053Lägenhet 054Lägenhet 055
索引
04230920,82499885559084230920,20000076293954230922,2000007629395
142309,041666666720,700000762939542309,041666666720,200000762939542309,041666666722,125
242309,083333333320,600000381469742309,083333333320,200000762939542309,083333333322,0249996185303

设置
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
库(XML)

tryAsNumeric colClasses似乎解决了数值vs因子的问题。但我还是收到了所有关于强制的警告。另外,我不知道完整数据库中rep的变量数量。如果我忘记了
readHTMLTable
,而改成“老派”,请参见我的编辑。
<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>
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