Цикл для создания одного фрейма данных из нескольких URL-адресов

У меня есть вектор символов с несколькими URL-адресами, каждый из которых содержит CSV-данные о преступности за определенный год. Есть ли простой способ создать цикл, который будет читать.csv и rbind все кадры данных без необходимости запуска read.csv 8 раз? Вектор URL-адресов ниже

urls <- c('https://opendata.arcgis.com/datasets/73cd2f2858714cd1a7e2859f8e6e4de4_33.csv',
          'https://opendata.arcgis.com/datasets/fdacfbdda7654e06a161352247d3a2f0_34.csv',
          'https://opendata.arcgis.com/datasets/9d5485ffae914c5f97047a7dd86e115b_35.csv',
          'https://opendata.arcgis.com/datasets/010ac88c55b1409bb67c9270c8fc18b5_11.csv',
          'https://opendata.arcgis.com/datasets/5fa2e43557f7484d89aac9e1e76158c9_10.csv',
          'https://opendata.arcgis.com/datasets/6eaf3e9713de44d3aa103622d51053b5_9.csv',
          'https://opendata.arcgis.com/datasets/35034fcb3b36499c84c94c069ab1a966_27.csv',
          'https://opendata.arcgis.com/datasets/bda20763840448b58f8383bae800a843_26.csv'
          )

person Howard Smith    schedule 13.07.2017    source источник


Ответы (3)


Функция map_dfr из пакета purrr делает именно то, что вам нужно. Он применяет функцию к каждому элементу ввода (в данном случае urls) и связывает результат по строке.

library(tidyverse)
map_dfr(urls, read_csv)

Я использовал read_csv() вместо read.csv() из личных предпочтений, но оба варианта будут работать.

person Andrew Brēza    schedule 13.07.2017
comment
Принимает ли map_dfr vectors так же, как lists? - person CPak; 13.07.2017
comment
@Sotos В пакете purrr так много замечательных инструментов, что я чувствую, что просто царапаю поверхность. - person Andrew Brēza; 13.07.2017
comment
@ChiPak Да, действительно, в моем примере urls - это вектор. - person Andrew Brēza; 13.07.2017

В базе R:

result <- lapply(urls, read.csv, stringsAsFactors = FALSE)
result <- do.call(rbind, result)
person Rui Barradas    schedule 13.07.2017

Я обычно использую этот подход, так как хочу сохранить все CSV-файлы отдельно на тот случай, если позже мне понадобится провести дополнительный анализ каждого из них. В противном случае вам не нужен цикл for.

for (i in 1:length(urls)) assign(paste0("mycsv-",i), read.csv(url(urls[i]), header = T))

df.list <- mget(ls(pattern = "mycsv-*"))

#use plyr if different column names and need to know which row comes from which csv file
library(plyr)
df <- ldply(df.list) #you can remove first column if you wish

#Alternative solution in base R instead of using plyr
#if they have same column names and you only want rbind then you can do this:
df <- do.call("rbind", df.list)
person M--    schedule 13.07.2017