Импорт данных в R из электронной таблицы google
По-видимому, изменения в настройках публикации электронной таблицы google. Публиковать в Интернете больше не возможно в виде файла csv или tab (см. Это последнее сообщение). Таким образом, обычный способ использования RCurl для импорта данных в R из google spreadsheed больше не работает:
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))
Есть ли у кого-то работа?
Ответы
Ответ 1
Используйте пакет googlesheets, API Google Таблиц R от Jenny Bryan. Это лучший способ анализа и редактирования данных Google Таблиц в R. Он может не только извлекать данные из Google Таблиц, но и редактировать данные в Google Таблицах, создавать новые листы и т.д.
Пакет можно установить с помощью install.packages("googlesheets")
.
Здесь vignette для начала работы; см. ее репозиторий GitHub для получения дополнительной информации. И вы также можете установить последнюю версию версии пакета с этой страницы GitHub, если это необходимо.
Ответ 2
Я просто написал простой пакет для решения именно этой проблемы: загрузка листа Google с использованием только URL-адреса.
install.packages('gsheet')
library(gsheet)
gsheet2tbl('docs.google.com/spreadsheets/d/1I9mJsS5QnXF2TNNntTy-HrcdHmIF9wJ8ONYvEJTXSNo')
Подробнее здесь: https://github.com/maxconway/gsheet
Ответ 3
Я работаю над решением для этого. Вот функция, которая работает с вашими данными, а также с некоторыми из моих собственных таблиц Google.
Во-первых, нам нужна функция для чтения из листов 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>
Ответ 4
Самый простой способ получить листы 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
Не уверен, что другие варианты использования имеют более высокую сложность или что-то изменилось за это время. После публикации таблицы в формате CSV этот простой 1-лайнер работал у меня:
myCSV<-read.csv("http://docs.google.com/spreadsheets/d/1XKeAajiH47jAP0bPkCtS4OdOGTSsjleOXImDrFzxxZQ/pub?output=csv")
R версия 3.3.2 (2016-10-31)
Ответ 6
Очистите таблицу html с помощью пакетов httr и 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
Ответ 7
Простейший способ.
Обязательно тщательно сопоставляйте свой URL-адрес с форматом примера здесь. На странице редактирования электронных таблиц Google вы можете получить все, кроме /export?format=csv
. Затем просто добавьте эту часть вручную в URL-адрес, а затем используйте, как показано здесь.
library(RCurl)
library(mosaic)
mydat2 <- fetchGoogle(paste0("https://docs.google.com/spreadsheets/d/",
"1mAxpSTrjdFv1UrpxwDTpieVJP16R9vkSQrpHV8lVTA8/export?format=csv"))
mydat2
Ответ 8
Опубликовать как CSV, похоже, не поддерживается (или, по крайней мере, в настоящее время не поддерживается) в новых Google Таблицах, по умолчанию для любого нового создаваемого вами листа. Однако вы можете создать листок в старом формате Google Таблиц, который поддерживает публикацию как CSV, через эту ссылку... https://g.co/oldsheets,
Подробнее о новых и старых листах здесь... https://support.google.com/drive/answer/3541068?p=help_new_sheets&rd=1
Ответ 9
Спасибо за это решение! Работает так же хорошо, как и старый. Я использовал другое исправление, чтобы избавиться от пустой первой строки. Когда вы просто исключите его, вы можете случайно удалить действительное наблюдение, когда линия "разморожена". Дополнительная инструкция в функции удаляет любые строки, которые не имеют метки времени.
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)
}
Ответ 10
По-прежнему (по состоянию на май 2015 года) можно получить файл CSV из таблиц Google, используя скрытый URL <sheeturl>/export?format=csv
трюк 1.
Однако, после решения этой проблемы, возникает другая проблема - номера отформатированы в соответствии с языковой настройкой листа, например. вы можете получить 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)
и установить завиток, но никаких других дополнительных пакетов.