web-dev-qa-db-fra.com

Importation de données dans R à partir de la feuille de calcul Google

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?

39
jokel

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.

45
Sam Firke

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

34
Max Conway

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>
15
Andrie

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)

8
RobE

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))
6
Senthil

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
2
jpmarindiaz

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
2
JumpIn

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.

0
flexponsive

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

0
DartPrivateer

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)
}
0
user3819568