我正在使用ROBDC将Excel工作表读入R.但是,我遇到了一些奇怪的结果。有时,重新启动R控制台会有所帮助,但我现在尝试了3次,并且以下错误(?)仍然存在。
Excel工作表包含数字块,我想将其读入数组。
这是我的sqlQuery:
channel <- odbcConnectExcel(paste("~link to file~"))
as.matrix(sqlQuery(channel,paste("select F13,F14,F15 from \"",land,i,"$\"",sep="")))
以下是结果的一部分:
32 NA NA NA
33 NA NA "Pf7"
34 "2.079975e+02" "6.762166e+01" NA
35 "1.721265e+02" "5.595971e+01" NA
36 "1.373673e+02" "4.465921e+01" NA
37 "1.200835e+02" "3.904013e+01" NA
38 "1.411489e+02" "4.588864e+01" NA
39 NA NA NA
40 NA NA NA
41 NA NA NA
42 NA NA "Pf7"
43 "1.443768e+00" "4.693807e-01" NA
44 "1.194778e+00" "3.884318e-01" NA
45 "9.535044e-01" "3.099920e-01" NA
46 "8.335332e-01" "2.709883e-01" NA
47 "9.797535e-01" "3.185257e-01" NA
48 NA NA NA
49 NA NA NA
在Excel工作表中,每个数字块前面都有Pf5:Pf7,每个描述Pf5:Pf7后跟5个数字。所有单元格都格式化为数字。可以下载Excel表格here。
在F13和F14栏中,RODBC删除了描述(这对我来说很奇怪但很好),在F15栏中它删除了数字(这对我来说根本就没问题!)
奇怪的是昨天完全相同的代码工作得很好,我没有更新任何R文件或以任何方式更改Excel工作表,所以我对可能导致错误的原因感到困惑。
我很感激任何可能有用的意见。
谢谢, 马丁
更新: 我尝试使用odbcConnectExcel2007而不是odbcConnectExcel,结果如下:
22 NA NA NA
23 NA NA NA
24 NA NA "Pf7"
25 "7.730711e+01" "1.958429e+01" "12,638675305"
26 "4.126044e+01" "1.045255e+01" "6,7455279987"
27 "4.293419e+01" "1.087656e+01" "7,0191635751"
28 "4.278764e+01" "1.083944e+01" "6,9952057822"
29 "4.073317e+01" "1.031897e+01" "6,6593269202"
30 NA NA NA
31 NA NA NA
32 NA NA NA
33 NA NA "Pf7"
34 "9.001111e+01" "2.280260e+01" "14,715610176"
35 "4.804083e+01" "1.217023e+01" "7,854032014"
36 "4.998963e+01" "1.266392e+01" "8,1726345871"
37 "4.981901e+01" "1.262070e+01" "8,1447397695"
38 "4.742692e+01" "1.201471e+01" "7,7536653665"
39 NA NA NA
40 NA NA NA
“,”而不是“。”可能是因为我使用德语版的Excel。我可以使用sub()来替换逗号,但是这(1)不是一个优雅的解决方案,并且(2)没有解释为什么它适用于前两个cols但不适用于第三个cols。 (也不是为什么它昨天工作但今天不工作......)
答案 0 :(得分:1)
查看Excel文件。该单元格的内容实际上是数字吗? (如果查看公式栏,'123
之类的内容会将单元格内容显示为字符串,而不是数字。)
您还可以考虑在read.xls
包中使用xlsReadWrite
。它比使用SQL查询更简单一些。 (同样,{2007}以后的read.xlsx
包中的xlsx
。)
答案 1 :(得分:1)
不要将as.matrix
用于可能具有不同列数据类型的数据框。
您的代码不是自包含的,但如果您将代码分解为可理解且可重现的内容,则应该非常明显地发生了什么。
使用问题中提供的zip文件“test2.xls”:
library(RODBC)
d <- sqlQuery(con, "SELECT [F13], [F14], [F15] FROM [Wien2008$]")
con <- odbcConnectExcel("test2.xls")
summary(d)
F13 F14 F15
Min. :6.584e-01 Min. :1.668e-01 Pf7 : 6
1st Qu.:4.073e+01 1st Qu.:5.744e+00 NA's:61
Median :7.731e+01 Median :1.262e+01
Mean :2.108e+03 Mean :1.027e+04
3rd Qu.:2.322e+02 3rd Qu.:4.738e+01
Max. :5.697e+04 Max. :2.791e+05
NA's :3.000e+01 NA's :3.400e+01
F13
和F14
看起来像是数字。
sapply(d, class)
F13 F14 F15
"numeric" "numeric" "factor"
如果我们使用as.matrix
删除所有结构会怎样?
mode(as.matrix(d))
[1] "character"
如果我们对任何旧数据帧执行此操作会发生什么?
mode(as.matrix(data.frame(x = rnorm(10), y = letters[1:10], stringsAsFactors = FALSE)))
[1] "character"
mode(as.matrix(data.frame(x = rnorm(10), y = factor(letters[1:10]))))
[1] "character"
mode(as.matrix(data.frame(x = rnorm(10), y = 1:10)))
[1] "numeric"
如果有数字和字符或因子列,则矩阵被强制转换为字符。
这与RODBC
完全无关。
答案 2 :(得分:0)
我无法使用R-2.13.0和RODBC_1.3-2复制您的问题。
> channel <- odbcConnectExcel("C:/test2.xls")
> (foo <- sqlQuery(channel, 'select F13, F14, F15 from "Wien2008$"'))
F13 F14 F15
22 NA NA NA
23 NA NA NA
24 NA NA NA
25 7.730711e+01 1.958429e+01 12.6386753
26 4.126044e+01 1.045255e+01 6.7455280
27 4.293419e+01 1.087656e+01 7.0191636
28 4.278764e+01 1.083944e+01 6.9952058
29 4.073317e+01 1.031897e+01 6.6593269
> sessionInfo()
R version 2.13.0 (2011-04-13)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] RODBC_1.3-2
loaded via a namespace (and not attached):
[1] tools_2.13.0
由于我无法复制这个问题,我不确定如何帮助......你说你没有更新任何R文件;这是否意味着您没有更改任何程序?您是否升级了R安装和/或升级了任何软件包?