Il semble y avoir un changement dans les options de publication de la feuille de calcul Google. Il n'est plus possible de publier sur le Web en tant que fichier csv ou tab ( voir cet article récent ). Ainsi, la façon habituelle d'utiliser RCurl pour importer des données dans R à partir d'une feuille de calcul Google ne fonctionne plus:
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))
Quelqu'un a-t-il une solution?
Utilisez le package googlesheets , une API Google Sheets R par Jenny Bryan. C'est le meilleur moyen d'analyser et de modifier les données de Google Sheets dans R. Non seulement il peut extraire des données de Google Sheets, mais vous pouvez modifier les données dans Google Sheets, créer de nouvelles feuilles, etc.
Le package peut être installé avec install.packages("googlesheets")
.
Il y a vignette pour commencer; voir son dépôt GitHub pour en savoir plus. Et vous pouvez également installer la dernière version de développement du package à partir de cette page GitHub, si vous le souhaitez.
Je viens d'écrire un package simple pour résoudre exactement ce problème: télécharger une feuille Google en utilisant uniquement l'URL.
install.packages('gsheet')
library(gsheet)
gsheet2tbl('docs.google.com/spreadsheets/d/1I9mJsS5QnXF2TNNntTy-HrcdHmIF9wJ8ONYvEJTXSNo')
Plus de détails sont ici: https://github.com/maxconway/gsheet
Je travaille sur une solution pour cela. Voici une fonction qui fonctionne sur vos données ainsi que sur quelques-unes de mes propres feuilles de calcul Google.
Tout d'abord, nous avons besoin d'une fonction pour lire à partir des feuilles Google. readGoogleSheet()
renverra une liste de trames de données, une pour chaque table trouvée sur la feuille 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})
}
Ensuite, nous avons besoin d'une fonction pour nettoyer les tables individuelles. cleanGoogleTable()
supprime les lignes vides insérées par Google, supprime les noms de ligne (s'ils existent) et vous permet de sauter les lignes vides avant le début du tableau:
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
}
Nous sommes maintenant prêts à vous lire la fiche 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>
Je ne sais pas si d'autres cas d'utilisation ont une complexité plus élevée ou si quelque chose a changé entre-temps. Après avoir publié la feuille de calcul au format CSV, cette simple ligne a fonctionné pour moi:
myCSV<-read.csv("http://docs.google.com/spreadsheets/d/1XKeAajiH47jAP0bPkCtS4OdOGTSsjleOXImDrFzxxZQ/pub?output=csv")
R version 3.3.2 (2016-10-31)
Il existe un moyen le plus simple de récupérer les feuilles Google même si vous êtes derrière le proxy
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))
Grattez la table html à l'aide de packages httr et XML.
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
Une manière plus simple.
Assurez-vous de faire correspondre soigneusement votre URL au format de l'exemple ici. Vous pouvez obtenir tout sauf le /export?format=csv
extrait de la page de modification de Google Spreadsheets. Ensuite, ajoutez simplement cette pièce manuellement à l'URL, puis utilisez-la comme indiqué ici.
library(RCurl)
library(mosaic)
mydat2 <- fetchGoogle(paste0("https://docs.google.com/spreadsheets/d/",
"1mAxpSTrjdFv1UrpxwDTpieVJP16R9vkSQrpHV8lVTA8/export?format=csv"))
mydat2
Il est toujours possible (en mai 2015) d'extraire un fichier CSV des feuilles de calcul Google, en utilisant l'URL cachée <sheeturl>/export?format=csv
Astuce 1 .
Cependant, après avoir résolu ce problème, on rencontre un autre problème - les nombres sont formatés en fonction des paramètres régionaux de la feuille, par ex. vous pouvez obtenir 1 234,15 dans une feuille "US" ou 1,234,15 dans une feuille "German". Pour décider des paramètres régionaux d'une feuille, accédez à Fichier> Paramètres de la feuille de calcul dans Google Documents.
Vous devez maintenant supprimer la marque décimale des colonnes numériques afin que R puisse les analyser; selon la taille de vos numéros, il peut être nécessaire de le faire plusieurs fois pour chaque colonne. Une fonction simple que j'ai écrite pour accomplir ceci:
# 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)));
}
Vous devrez require(utils)
et avoir curl installé, mais pas d'autres packages supplémentaires.
Publier au format CSV ne semble pas être pris en charge (ou du moins actuellement pris en charge) dans les nouvelles feuilles de calcul Google, qui est la valeur par défaut pour tout nouvelle feuille que vous créez. Vous pouvez cependant créer une feuille dans l'ancien format Google Sheets, qui prend en charge la publication au format CSV, via ce lien ... https://g.co/oldsheets .
Plus de détails sur les nouvelles et les anciennes feuilles sont ici ... https://support.google.com/drive/answer/3541068?p=help_new_sheets&rd=1
Merci pour cette solution! Fonctionne aussi bien que l'ancien. J'ai utilisé un autre correctif pour supprimer la première ligne vierge. Lorsque vous l'excluez, vous risquez par accident de supprimer une observation valide lorsque la ligne est "non gelée". L'instruction supplémentaire de la fonction supprime toutes les lignes qui n'ont pas d'horodatage.
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)
}