我是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)
Run Code Online (Sandbox Code Playgroud)
这导致:
'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 ...
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!我是R的新手,所以猜测(希望)这是一个简单的!
用stringsAsFactors = FALSEin 读取数据,删除逗号(with gsub())并转换为numeric(with 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
Run Code Online (Sandbox Code Playgroud)
是.两种方法.最容易理解的可能只是将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 ...
Run Code Online (Sandbox Code Playgroud)
as-methods是强制性的.有许多这样的方法在基R,如as.list,as.numeric,as.character.在每种情况下,他们都尝试获取处于一种模式的输入,并以不同的模式对其进行合理的复制.例如,将矩阵强制转换为数据帧是有意义的,因为它们都有两个维度.将数据帧强制转换为矩阵的意义稍微不大(但它确实成功地丢失了列的所有属性并强制转换为共同模式.)
在本例中,我将字符串作为输入,删除任何逗号,并将字符值强制转换为数字.然后我使用read.table's(在这种情况下通过read.csv)'colClasses'参数来调度我注册的as-method setAs.您可能需要转到该help(setAs)页面以获取更多详细信息.S4类系统让很多人感到困惑,包括我.这是我用S4方法取得成功的唯一方面.