Да. Два метода. Поначалу проще всего понять, возможно, просто 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.