RODBC (иногда) не читает номера - PullRequest
1 голос
/ 18 апреля 2011

Я читаю листы Excel в R, используя ROBDC. Однако я столкнулся с некоторыми странными результатами. Иногда перезапуск консоли 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 можно скачать здесь .

В столбцах F13 и F14 RODBC отбрасывает описания (что странно, но мне хорошо), в столбце F15 - числа (что мне совсем не подходит!)

Странно то, что вчера точно такой же код работал нормально, и я не обновлял R-файлы и не изменял листы Excel, поэтому я озадачен тем, что может вызвать ошибку.

Я благодарен за любые комментарии, которые могут помочь.

Спасибо, Martin

UPDATE: Я попытался использовать 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) не объясняет, почему оно работает с первыми двумя столбцами, но не с третьим. (А также не почему это работало вчера, но не сегодня ...)

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Не используйте as.matrix для кадра данных, который может иметь разные типы данных столбца.

Ваш код не самодостаточен, но должно быть довольно очевидно, что происходит, если вы раскладываете свой код на что-то понятное и воспроизводимое.

Использование файла "test2.xls" в zip-файле, указанном в вопросе:

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.

1 голос
/ 18 апреля 2011

Посмотрите в файле Excel. Содержимое ячейки на самом деле нумеруется? (Если вы посмотрите в строке формул, что-то вроде '123 показывает, что содержимое ячейки является строкой, а не числом.)

Вы также можете использовать, например, read.xls в пакете xlsReadWrite. Это немного проще, чем использовать SQL-запросы. (Аналогично, read.xlsx в пакете xlsx для Excel 2007 и более поздних версий.)

0 голосов
/ 18 апреля 2011

Я не могу воспроизвести вашу проблему, используя 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 и / или обновили какие-либо пакеты?

...