Google电子表格发布选项似乎有所变化。不再可以将其作为csv或tab文件(see this recent post)发布到Web。因此,使用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))
有没有人有解决方法?
答案 0 :(得分:43)
使用googlesheets套餐,Jenny Bryan的Google表格R API。这是在R中分析和编辑Google表格数据的最佳方式。它不仅可以从Google表格中提取数据,还可以在Google表格中编辑数据,创建新工作表等。
可以使用install.packages("googlesheets")
安装软件包。
开始时有vignette;有关详情,请参阅her GitHub repository。如果需要,您还可以从该GitHub页面安装该软件包的最新开发版本。
答案 1 :(得分:31)
我刚刚编写了一个简单的软件包来解决这个问题:只使用URL下载Google表格。
install.packages('gsheet')
library(gsheet)
gsheet2tbl('docs.google.com/spreadsheets/d/1I9mJsS5QnXF2TNNntTy-HrcdHmIF9wJ8ONYvEJTXSNo')
答案 2 :(得分:15)
我正在为此制定解决方案。这是一个适用于您的数据的功能以及我自己的一些Google Spreadsheets。
首先,我们需要一个功能来阅读Google表格。 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>
答案 3 :(得分:7)
不确定其他用例是否具有更高的复杂性,或者是否同时发生了某些变化。在以CSV格式发布电子表格后,这个简单的1-liner为我工作:
myCSV<-read.csv("http://docs.google.com/spreadsheets/d/1XKeAajiH47jAP0bPkCtS4OdOGTSsjleOXImDrFzxxZQ/pub?output=csv")
R版本3.3.2(2016-10-31)
答案 4 :(得分:6)
即使您在代理服务器后面,也可以通过最简单的方式获取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))
答案 5 :(得分:2)
使用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
答案 6 :(得分:2)
更简单的方法。
请务必在此处仔细将您的网址与示例网址的格式相匹配。您可以从Google Spreadsheets编辑页面获取除/export?format=csv
以外的所有内容。然后,只需手动将此片段添加到URL,然后使用如下所示。
library(RCurl)
library(mosaic)
mydat2 <- fetchGoogle(paste0("https://docs.google.com/spreadsheets/d/",
"1mAxpSTrjdFv1UrpxwDTpieVJP16R9vkSQrpHV8lVTA8/export?format=csv"))
mydat2
答案 7 :(得分:0)
新Google表格似乎不支持发布为CSV(或至少不支持 <支持),这是您创建的任何新工作表的默认设置。不过,您可以通过此链接创建旧Google表格格式的工作表,该工作表支持以CSV格式发布... https://g.co/oldsheets。
有关新表格与旧表格的详细信息,请点击此处https://support.google.com/drive/answer/3541068?p=help_new_sheets&rd=1
答案 8 :(得分:0)
感谢您的解决方案!效果和旧的一样好。我用另一个修复来摆脱空白的第一行。当您只是排除它时,您可能会在线路“解冻”时删除有效的观察。函数中的额外指令删除任何没有时间戳的行。
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)
}
答案 9 :(得分:0)
使用隐藏的网址<sheeturl>/export?format=csv
技巧1,仍然(截至2015年5月)可以从Google电子表格中获取CSV文件。
然而,在解决了这个问题之后,人们遇到了另一个问题 - 根据工作表的区域设置格式化数字,例如,您可以在“美国”表格中获得1,234.15或在“德国”表格中获得1.234,15。要确定工作表区域设置,请转到文件&gt; Google文档中的电子表格设置。
现在您需要从数字列中删除小数点,以便R可以解析它们;根据您的数字有多大,每列可能需要多次完成。我写的一个简单的函数来完成这个:
# 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,但没有其他额外的包。