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

jok*_*kel 41 r google-sheets

谷歌电子表格发布选项似乎有所变化.不再可以将其作为csv或tab文件发布到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))
Run Code Online (Sandbox Code Playgroud)

有人有解决方法吗?

Sam*_*rke 46

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

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

入门有一个小插曲 ; 请参阅她的GitHub存储库了解更多信息.如果需要,您还可以从该GitHub页面安装该软件包的最新开发版本.

  • 只是为了让人们在未来迈出一步 - 看起来“googlesheets”包即将退役。[googlesheets4](https://googlesheets4.tidyverse.org/) 是它的替代品。 (10认同)
  • 请在此答案中包括该软件包的一些基本用法 (3认同)

小智 35

我刚刚编写了一个简单的软件包来解决这个问题:只使用URL下载Google表格.

install.packages('gsheet')
library(gsheet)
gsheet2tbl('docs.google.com/spreadsheets/d/1I9mJsS5QnXF2TNNntTy-HrcdHmIF9wJ8ONYvEJTXSNo')
Run Code Online (Sandbox Code Playgroud)

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

  • 好的简单解决方案 (2认同)

And*_*rie 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})
}
Run Code Online (Sandbox Code Playgroud)

接下来,我们需要一个函数来清理各个表. 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
}
Run Code Online (Sandbox Code Playgroud)

现在我们已准备好为您阅读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>
Run Code Online (Sandbox Code Playgroud)

  • 尝试这一点,但得到一个文件中的错误(con,"r")(来自#5):无法打开连接`任何想法可能导致这个? (2认同)

rob*_*rse 8

不确定其他用例是否具有更高的复杂性或者是否同时发生了某些变化.以CSV格式发布电子表格后,这个简单的1-liner对我有用:

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

R版本3.3.2(2016-10-31)

  • 这是最好的答案,非常感谢。请注意,它也适用于这种格式:https://docs.google.com/spreadsheets/d/SPREEDSHEET_ID/gviz/tq?tqx=out:csv&amp;sheet=NAME_OF_TAB,以便您可以选择所需的选项卡(对于带有以下内容的工作表很有用)许多选项卡) (2认同)

Sen*_*hil 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))
Run Code Online (Sandbox Code Playgroud)