2011-12-28 1 views
4

Я новичок в R и пытаюсь прочитать общедоступную электронную таблицу Google в R-кадре данных с числовыми столбцами. Моя проблема заключается в том, что в экспортируемой электронной таблице есть запятые в большом количестве, например «13 061,422». Функция read.csv() рассматривает это как фактор. Я попробовал строкиAsFactors = FALSE и colClasses = c (rep ("numeric", 7)), но не работал. Есть ли способ принуждения значений с запятыми и десятичными знаками к числовым значениям, либо в read.csv(), либо впоследствии, когда они рассматриваются как факторы в R-кадре данных R? Вот мой код:Документы Google экспортируют значения электронных таблиц запятыми. read.csv() в R рассматривает их как факторы вместо числовых

require(RCurl) 

myCsv <- getURL("https://docs.google.com/spreadsheet/pub?hl=en_US&hl=en_US&key=0Agbdciapt4QZdE95UDFoNHlyNnl6aGlqbGF0cDIzTlE&single=true&gid=0&range=A1%3AG4928&output=csv", ssl.verifypeer=FALSE) #ssl.verifypeer=FALSE gets around certificate issues I don't understand. 

fullmatrix <- read.csv(textConnection(myCsv)) 

str(fullmatrix) 

, что приводит к:

'data.frame': 4927 obs. of 7 variables: 
$ wave.  : Factor w/ 4927 levels "1,000.8900","1,002.8190",..: 4875 4874 4873 4872 4871 4870 4869 4868 4867 4866 ... 
$ wavelength : Factor w/ 4927 levels "1,000.074","1,000.267",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ d2o  : num 85.2 87.7 86.3 87.6 85.6 ... 
$ di   : num 54.3 55.8 54.9 55.6 54.9 ... 
$ ddw  : num 48.2 49.7 49.4 50.2 49.6 ... 
$ ddw.old : num 53.3 55 53.9 54.8 53.7 ... 
$ d2o.ddw.mix: num 65.8 67.9 67.2 68.4 66.8 ... 

Спасибо за любую помощь! Я новичок в R, так что угадать (надеясь) это легко!

+0

Если вы любите любые ответы на буксир, вы можете пометить его как принятый. – EDi

ответ

8

Да. Два метода. Проще всего понять сначала, вероятно, это просто as.is=TRUE, чтобы сохранить их как символьные векторы, а затем использовать gsub для удаления запятых и любых символов валюты перед преобразованием в числовой. Второе немного сложнее, но я думаю, что больше. Создайте метод as-method для используемого вами формата. Затем вы можете использовать colClasses, чтобы сделать это за один шаг.

Я вижу @EDi уже сделал версию # 1 (с использованием stringsAsFactors, а не as.is, поэтому я буду документировать стратегию # 2:.

library(methods) 
setClass("num.with.commas") 
#[1] "num.with.commas" 
setAs("character", "num.with.commas", 
     function(from) as.numeric(gsub(",", "", from))) 
require(RCurl) 
#Loading required package: RCurl 
#Loading required package: bitops 

myCsv <- getURL("https://docs.google.com/spreadsheet/pub?hl=en_US&hl=en_US&key=0Agbdciapt4QZdE95UDFoNHlyNnl6aGlqbGF0cDIzTlE&single=true&gid=0&range=A1%3AG4928&output=csv", ssl.verifypeer=FALSE) 
> fullmatrix <- read.csv(textConnection(myCsv), 
         colClasses=c(rep("num.with.commas",2), rep("numeric",4))) 
str(fullmatrix) 
#-------------- 
'data.frame': 4927 obs. of 7 variables: 
$ wave.  : num 9999 9997 9995 9993 9992 ... 
$ wavelength : num 1000 1000 1000 1001 1001 ... 
$ d2o  : num 85.2 87.7 86.3 87.6 85.6 ... 
$ di   : num 54.3 55.8 54.9 55.6 54.9 ... 
$ ddw  : num 48.2 49.7 49.4 50.2 49.6 ... 
$ ddw.old : num 53.3 55 53.9 54.8 53.7 ... 
$ d2o.ddw.mix: num 65.8 67.9 67.2 68.4 66.8 ... 

, как-методы коэрцитивны Есть много таких методов в базе R, такие как as.list, as.numeric, as.character. В каждом случае они пытаются ввести ввод, который находится в одном режиме, и сделать разумную копию этого в другом режиме. Например, имеет смысл принудить матрицу к кадру данных, поскольку они оба имеют два измерения. Это немного снижает смысл для привязки матрицы данных к матрице (но она преуспевает с потерей всех атрибутов столбцов и co ercion к общему режиму.)

В данном случае я беру строку символов в качестве входных данных, удаляя любые запятые и принуждая значения символов к числовым. Затем я использую read.table (в этом случае с помощью read.csv) аргумент colClasses для отправки в as-метод I, зарегистрированный с setAs. Для получения более подробной информации вы можете перейти на страницу help(setAs). Система класса S4 смущает многих людей, включая меня. Это касается единственной области успеха, которую я имел с методами S4.

+0

Спасибо! Согласитесь, очень круто. Это работает для меня, но не совсем понимаю ... пока :) –

+0

Я добавлю еще несколько пояснительных текстов. –

8

Считывание данных с stringsAsFactors = FALSE в удалите запятые (с gsub()) и преобразовать в числовой (с as.numeric()):

> fullmatrix <- read.csv(textConnection(myCsv), stringsAsFactors = FALSE) 

> str(fullmatrix) 
'data.frame': 4927 obs. of 7 variables: 
$ wave.  : chr "9,999.2590" "9,997.3300" "9,995.4010" "9,993.4730" ... 
$ wavelength : chr "1,000.07410549122" "1,000.26707130804" "1,000.46011160533" "1,000.65312629553" ... 
$ d2o  : num 85.2 87.7 86.3 87.6 85.6 ... 
$ di   : num 54.3 55.8 54.9 55.6 54.9 ... 
$ ddw  : num 48.2 49.7 49.4 50.2 49.6 ... 
$ ddw.old : num 53.3 55 53.9 54.8 53.7 ... 
$ d2o.ddw.mix: num 65.8 67.9 67.2 68.4 66.8 ... 

> fullmatrix$wave. <- as.numeric(gsub(",", "", fullmatrix$wave.)) 
> fullmatrix$wavelength <- as.numeric(gsub(",", "", fullmatrix$wavelength)) 

> str(fullmatrix) 
'data.frame': 4927 obs. of 7 variables: 
$ wave.  : num 9999 9997 9995 9993 9992 ... 
$ wavelength : num 1000 1000 1000 1001 1001 ... 
$ d2o  : num 85.2 87.7 86.3 87.6 85.6 ... 
$ di   : num 54.3 55.8 54.9 55.6 54.9 ... 
$ ddw  : num 48.2 49.7 49.4 50.2 49.6 ... 
$ ddw.old : num 53.3 55 53.9 54.8 53.7 ... 
$ d2o.ddw.mix: num 65.8 67.9 67.2 68.4 66.8 ... 

> fullmatrix[1, 1] 
[1] 9999.259 
+0

Спасибо, отлично работает! –