web-dev-qa-db-ja.com

GoogleスプレッドシートからRにデータをインポートする

Googleスプレッドシートの公開オプションに変更があるようです。 csvまたはタブファイルとしてWebに公開することはできなくなりました( この最近の投稿を参照 )。したがって、RCurlを使用してGoogleスプレッドシートから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))

誰かが回避策を持っていますか?

39
jokel

Jenny BryanによるGoogle Sheets R APIである googlesheets パッケージを使用します。 RでGoogleスプレッドシートデータを分析および編集するのに最適な方法です。Googleスプレッドシートからデータをプルできるだけでなく、Googleスプレッドシートでデータを編集したり、新しいシートを作成したりすることもできます。

パッケージはinstall.packages("googlesheets")でインストールできます。

vignette が開始のためにあります。 her GitHub repository を参照してください。また、必要に応じて、そのGitHubページからパッケージの最新の開発バージョンをインストールすることもできます。

45
Sam Firke

この問題を正確に解決する簡単なパッケージを作成しました。URLのみを使用してGoogleシートをダウンロードします。

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

詳細はこちら: https://github.com/maxconway/gsheet

34
Max Conway

私はこのための解決策に取り組んでいます。これは、データといくつかの独自のGoogleスプレッドシートで機能する関数です。

まず、Googleシートから読み取る関数が必要です。 readGoogleSheet()は、Googleシートにある各テーブルに1つずつ、データフレームのリストを返します。

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

他のユースケースがより複雑かどうか、または何かがその間に変更されたかどうかはわかりません。スプレッドシートをCSV形式で公開した後、このシンプルな1ライナーが役に立ちました。

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

Rバージョン3.3.2(2016-10-31)

8
RobE

プロキシの背後にいる場合でも、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))
6
Senthil

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

より簡単な方法。

URLをここの例の形式に注意深く一致させてください。 Googleスプレッドシートの編集ページから/export?format=csv以外のすべてを取得できます。次に、この部分をURLに手動で追加し、次に示すように使用します。

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

非表示のURL _<sheeturl>/export?format=csv_ trick 1 を使用して、GoogleスプレッドシートからCSVファイルを取得することはまだ可能です(2015年5月現在)。

ただし、この問題を解決した後、別の問題が発生します。数値は、シートのロケールに従ってフォーマットされます。 「US」シートで1,234.15、「ドイツ」シートで1.234,15を取得できます。シートロケールを決定するには、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をインストールする必要がありますが、他の追加パッケージは必要ありません。

0
flexponsive

CSVとして公開することは、新しいGoogleスプレッドシートではサポートされていないようです(または、少なくとも現在サポートされていないはサポートされていない)作成する新しいシート。ただし、CSV形式での公開をサポートしている古いGoogleスプレッドシート形式のシートは、このリンクから作成できます... https://g.co/oldsheets

新しいスプレッドシートと古いスプレッドシートの詳細はこちら... https://support.google.com/drive/answer/3541068?p=help_new_sheets&rd=1

0
DartPrivateer

この解決策をありがとう!古いものと同じように動作します。別の修正を使用して、空白の最初の行を削除しました。除外するだけの場合、ラインが「フリーズ解除」されていると、誤って有効な観測を削除してしまう可能性があります。関数内の追加の命令は、タイムスタンプのない行を削除します。

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