Документы Google экспортируют значения электронных таблиц с запятыми. read.csv () в R обрабатывает их как факторы вместо числовых - PullRequest
4 голосов
/ 28 декабря 2011

Я новичок в R и пытаюсь прочитать общедоступную электронную таблицу Google в фрейме данных R с числовыми столбцами.Кажется, моя проблема в том, что экспортированная электронная таблица имеет большие запятые, например, «13 061,422».Функция read.csv () рассматривает это как фактор.Я пробовал stringsAsFactors = FALSE и colClasses = c (rep ("numeric", 7)), но ни один из них не работал.Есть ли способ привести значения с запятыми и десятичными числами к числовым значениям, либо в 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, так что думаю (надеюсь), что это легко!

Ответы [ 2 ]

8 голосов
/ 28 декабря 2011

Да. Два метода. Поначалу проще всего понять, возможно, просто as.is=TRUE, чтобы сохранить их как символьные векторы, а затем использовать gsub, чтобы удалить запятые и любые символы валюты перед преобразованием в числовое значение. Второй немного сложнее, но я думаю, что больше kewl. Создайте as-метод для формата, который вы используете. Затем вы можете использовать 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 ...

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

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

8 голосов
/ 28 декабря 2011

Считайте данные с помощью 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
...