从谷歌电子表格导入数据到R

谷歌电子表格发布选项似乎有所改变。 不能再以csv或tab文件的forms发布到networking上( 请参阅最近的文章 )。 因此,通常使用RCurl将数据导入R中的方法不再适用:

require(RCurl) u <- "https://docs.google.com/spreadsheet/pub?hl=en_GB&hl=en_GB&key=0AmFzIcfgCzGFdHQ0eEU0MWZWV200RjgtTXVMY1NoQVE&single=true&gid=4&output=csv" tc <- getURL(u, ssl.verifypeer=FALSE) net <- read.csv(textConnection(tc)) 

有没有人有办法?

使用Google表格软件包,Jenny Bryan的Google Sheets R API。 这是在R中分析和编辑Google表格数据的最佳方式。它不仅可以从Google表格中提取数据,还可以在Google表格中编辑数据,创build新工作表等。

该软件包可以安装install.packages("googlesheets")

有一个入门的小插曲 ; 看到她的GitHub存储库更多。 如果需要的话,您也可以从该GitHub页面安装软件包的最新开发版本。

我只写了一个简单的包来解决这个问题:只使用URL下载一个Google工作表。

 install.packages('gsheet') library(gsheet) gsheet2tbl('docs.google.com/spreadsheets/d/1I9mJsS5QnXF2TNNntTy-HrcdHmIF9wJ8ONYvEJTXSNo') 

更多细节在这里: https : //github.com/maxconway/gsheet

我正在为此解决scheme。 这里有一个可以处理您的数据的function,以及一些我自己的Google Spreadsheets。

首先,我们需要一个从Google表单读取的function。 readGoogleSheet()将返回一个数据框列表,其中一个用于Google表格中的每个表格:

 readGoogleSheet <- function(url, na.string="", header=TRUE){ stopifnot(require(XML)) # Suppress warnings because Google docs seems to have incomplete final line suppressWarnings({ doc <- paste(readLines(url), collapse=" ") }) if(nchar(doc) == 0) stop("No content found") htmlTable <- gsub("^.*?(<table.*</table).*$", "\\1>", doc) ret <- readHTMLTable(htmlTable, header=header, stringsAsFactors=FALSE, as.data.frame=TRUE) lapply(ret, function(x){ x[ x == na.string] <- NA; x}) } 

接下来,我们需要一个清理单个表的函数。 cleanGoogleTable()删除Google插入的空行,删除行名(如果存在),并允许您在表开始之前跳过空行:

 cleanGoogleTable <- function(dat, table=1, skip=0, ncols=NA, nrows=-1, header=TRUE, dropFirstCol=NA){ if(!is.data.frame(dat)){ dat <- dat[[table]] } if(is.na(dropFirstCol)) { firstCol <- na.omit(dat[[1]]) if(all(firstCol == ".") || all(firstCol== as.character(seq_along(firstCol)))) { dat <- dat[, -1] } } else if(dropFirstCol) { dat <- dat[, -1] } if(skip > 0){ dat <- dat[-seq_len(skip), ] } if(nrow(dat) == 1) return(dat) if(nrow(dat) >= 2){ if(all(is.na(dat[2, ]))) dat <- dat[-2, ] } if(header && nrow(dat) > 1){ header <- as.character(dat[1, ]) names(dat) <- header dat <- dat[-1, ] } # Keep only desired columns if(!is.na(ncols)){ ncols <- min(ncols, ncol(dat)) dat <- dat[, seq_len(ncols)] } # Keep only desired rows if(nrows > 0){ nrows <- min(nrows, nrow(dat)) dat <- dat[seq_len(nrows), ] } # Rename rows rownames(dat) <- seq_len(nrow(dat)) dat } 

现在,我们已经准备好阅读您的Google表格:

 > u <- "https://docs.google.com/spreadsheets/d/0AmFzIcfgCzGFdHQ0eEU0MWZWV200RjgtTXVMY1NoQVE/pubhtml" > g <- readGoogleSheet(u) > cleanGoogleTable(g, table=1) 2012-Jan Mobile internet Tanzania 1 Airtel Zantel Vodacom Tigo TTCL Combined > cleanGoogleTable(g, table=2, skip=1) BUNDLE FEE VALIDITY MB Cost Sh/MB 1 Daily Bundle (20MB) 500/= 1 day 20 500 25.0 2 1 Day bundle (300MB) 3,000/= 1 day 300 3,000 10.0 3 Weekly bundle (3GB) 15,000/= 7 days 3,000 15,000 5.0 4 Monthly bundle (8GB) 70,000/= 30 days 8,000 70,000 8.8 5 Quarterly Bundle (24GB) 200,000/= 90 days 24,000 200,000 8.3 6 Yearly Bundle (96GB) 750,000/= 365 days 96,000 750,000 7.8 7 Handset Browsing Bundle(400 MB) 2,500/= 30 days 400 2,500 6.3 8 STANDARD <NA> <NA> 1 <NA> <NA> 

即使您位于代理之后,也可以通过最简单的方式获取Google表格

 require(RCurl) fileUrl <- "https://docs.google.com/spreadsheets/d/[ID]/export?format=csv" fileCSV <- getURL(fileUrl,.opts=list(ssl.verifypeer=FALSE)) fileCSVDF <- read.csv(textConnection(fileCSV)) 

不确定其他用例是否具有更高的复杂性,或者是否同时发生了变化。 以CSV格式发布电子表格之后,这个简单的一行就为我工作了:

 myCSV<-read.csv("http://docs.google.com/spreadsheets/d/1XKeAajiH47jAP0bPkCtS4OdOGTSsjleOXImDrFzxxZQ/pub?output=csv") 

R版本3.3.2(2016-10-31)

使用httr和XML包来刮取html表格。

 library(XML) library(httr) url <- "https://docs.google.com/spreadsheets/d/12MK9EFmPww4Vw9P6BShmhOolH1C45Irz0jdzE0QR3hs/pubhtml" readSpreadsheet <- function(url, sheet = 1){ library(httr) r <- GET(url) html <- content(r) sheets <- readHTMLTable(html, header=FALSE, stringsAsFactors=FALSE) df <- sheets[[sheet]] dfClean <- function(df){ nms <- t(df[1,]) names(df) <- nms df <- df[-1,-1] row.names(df) <- seq(1,nrow(df)) df } dfClean(df) } df <- readSpreadsheet(url) df 

一个更简单的方法。

一定要仔细匹配你的URL到这里的例子的格式。 除了Google Spreadsheets编辑页面上的/export?format=csv部分,您可以获取所有内容。 然后,只需手动将此片段添加到url,然后按照此处所示使用。

 library(RCurl) library(mosaic) mydat2 <- fetchGoogle(paste0("https://docs.google.com/spreadsheets/d/", "1mAxpSTrjdFv1UrpxwDTpieVJP16R9vkSQrpHV8lVTA8/export?format=csv")) mydat2 

以CSV格式发布似乎并不支持(或者至less目前不支持)新的Google表格,这是您创build的任何新表格的默认设置。 不过,您可以使用旧的Google表格格式创build一张表格,该表格支持通过此链接发布为CSV … https://g.co/oldsheets

有关新旧表格的更多详情,请访问https://support.google.com/drive/answer/3541068?p=help_new_sheets&rd=1

感谢您的解决scheme! 和旧的一样好。 我用另一个修复来摆脱空白的第一行。 当你把它排除在外时,你可能会在事故发生时,删除一条有效的观察结果。 函数中的额外指令将删除任何没有时间戳的行。

 readSpreadsheet <- function(url, sheet = 1){ library(httr) r <- GET(url) html <- content(r) sheets <- readHTMLTable(html, header=FALSE, stringsAsFactors=FALSE) df <- sheets[[sheet]] dfClean <- function(df){ nms <- t(df[1,]) names(df) <- nms df <- df[-1,-1] df <- df[df[,1] != "",] ## only select rows with time stamps row.names(df) <- seq(1,nrow(df)) df } dfClean(df) } 

它仍然(截至2015年5月)可能使用隐藏的URL <sheeturl>/export?format=csv技巧1从Google Spreadsheets中获取CSV文件。

然而,在解决这个问题之后,会遇到另外一个问题 – 数字是根据表单的区域设置的,例如,在“US”表单中可以得到1,234.15,在“German”表单中可以得到1.234.15。 要决定表单区域设置,请转到Google文档中的文件>电子表格设置。

现在,您需要从数字列中删除小数点标记,以便R可以parsing它们; 取决于你的数字有多大,这可能需要对每列进行几次。 我写了一个简单的函数来实现这个function:

 # helper function to load google sheet and adjust for thousands separator (,) getGoogleDataset <- function(id) { download.file(paste0('https://docs.google.com/spreadsheets/d/', id, '/export?format=csv'),'google-ds.csv','curl'); lines <- scan('google-ds.csv', character(0), sep="\n"); pattern<-"\"([0-9]+),([0-9]+)"; for (i in 0:length(lines)) { while (length(grep(pattern,lines[i]))> 0) { lines[i] <- gsub(pattern,"\"\\1\\2",lines[i]); } } return(read.csv(textConnection(lines))); } 

您将需要require(utils)并安装curl,但不需要其他额外的软件包。