基于列表通过HTTPS将多个CSV文件导入R.

时间:2018-01-26 19:09:42

标签: r loops csv for-loop import

我在导入CSV时看到了类似的帖子,但没有导入文件类型根据列表具有相似名称的导入。我想编写一个遍历名称列表的循环,并导入每个CSV。

我在网站上有一个500 CSV的列表,我想将其导入R.每个文件都有一个类似的URL。例如,网址中的5个可能如下所示:

https://www.website.com/datasets/Dog/1234.csv
https://www.website.com/datasets/Cat/1234.csv
https://www.website.com/datasets/Turtle/1234.csv
https://www.website.com/datasets/Bird/1234.csv
https://www.website.com/datasets/Cow/1234.csv

实际的CSV数据如下所示:

Date,Open,High,Low,2018-01-25,174.505,174.95,170.53

前四项是列名。

更改网址的唯一部分是动物的名称。我在单独的XLS文件中列出了500只动物。

我知道如何将单个CSV文件导入单个数据帧:

Dog<-read.csv('https://www.website.com/datasets/Dog/1234.csv')

但是如何根据单独的XLS文件中的动物列表将所有这些一次导入一个CSV文件?我以为我可以将动物列表保存为一个单独的变量,然后遍历列表,但我被卡在那里:

List <- as.character( read.csv (https://www.website.com/datasets/AnimalList/1234.csv', stringsAsFactors = FALSE, header = FALSE))

对于5只动物,最终的数据框应该看起来像这样,列名为Date,Open,High,Low和Animal。

Date    Open    High    Low Animal
018-01-17   156 111 196 Dog
018-01-18   133 153 112 Dog
018-01-19   194 182 117 Dog
018-01-20   199 158 109 Dog
018-01-21   137 151 145 Dog
018-01-22   164 192 141 Dog
018-01-23   152 113 128 Dog
018-01-24   125 114 175 Dog
018-01-25   152 132 112 Dog
018-01-26   149 125 139 Dog
018-01-17   118 128 134 Cat
018-01-18   168 136 107 Cat
018-01-19   187 150 185 Cat
018-01-20   122 178 190 Cat
018-01-21   112 186 169 Cat
018-01-22   120 192 189 Cat
018-01-23   134 149 106 Cat
018-01-24   195 172 172 Cat
018-01-25   192 162 113 Cat
018-01-26   198 170 118 Cat
018-01-17   160 188 129 Turtle
018-01-18   100 111 129 Turtle
018-01-19   165 101 145 Turtle
018-01-20   200 130 174 Turtle
018-01-21   130 113 130 Turtle
018-01-22   189 101 169 Turtle
018-01-23   185 146 104 Turtle
018-01-24   126 177 102 Turtle
018-01-25   143 102 167 Turtle
018-01-26   107 168 151 Turtle
018-01-17   193 121 169 Bird
018-01-18   148 134 164 Bird
018-01-19   199 192 106 Bird
018-01-20   138 160 124 Bird
018-01-21   105 140 161 Bird
018-01-22   182 170 185 Bird
018-01-23   119 171 172 Bird
018-01-24   154 115 130 Bird
018-01-25   104 105 158 Bird
018-01-26   100 153 169 Bird
018-01-17   191 192 187 Cow
018-01-18   187 128 107 Cow
018-01-19   198 135 114 Cow
018-01-20   170 110 185 Cow
018-01-21   141 119 112 Cow
018-01-22   173 159 173 Cow
018-01-23   139 186 155 Cow
018-01-24   169 178 172 Cow
018-01-25   101 149 155 Cow
018-01-26   157 178 161 Cow

1 个答案:

答案 0 :(得分:1)

您可以使用purrr使用map_df循环遍历每个文件名,library(tidyverse) #all animal names animal.names <- c("Dog", "Cat", "Turtle", "Bird", "Cow") 获取每次迭代的结果,并将行绑定到数据框中。

准备所有名称

scrape_csv <- function(animal.names){
  #create urls
  animal.urls <- paste0("https://www.website.com/datasets/",animal.names,"/1234.csv")
  #read in file
  df <- read_csv( as.character(animal.urls) )
  #add animal name as col
  df$Animal <- animal.names
  return(df)
}

为map_df

创建基本功能
  • 根据名称创建网址
  • 通过网址路径阅读csv
  • 将动物名称添加为id列
  • 转到下一个动物档案

功能:

df_results <- animal.names %>% map_df( scrape_csv )

将每个名称映射到函数并存储结果:

<div class="container-fluid">
    <div class="row">
      <div class="btn-group dropright">
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
      Dropright
    </button>
        <div class="dropdown-menu">
          <!-- Dropdown menu links -->
          <div class="form-check form-check-inline">
            <input class="form-check-input" type="checkbox" id="inlineCheckbox1" value="option1">
            <label class="form-checka-label" for="inlineCheckbox1">1</label>
          </div>
          <div class="form-check form-check-inline">
            <input class="form-check-input" type="checkbox" id="inlineCheckbox2" value="option2">
            <label class="form-check-label" for="inlineCheckbox2">2</label>
          </div>
          <div class="form-check form-check-inline">
            <input class="form-check-input" type="checkbox" id="inlineCheckbox3" value="option3" disabled>
            <label class="form-check-label" for="inlineCheckbox3">3 (disabled)</label>
          </div>
        </div>
      </div>
    </div>
    <div class="row">
      <div class="container"></div>
    </div>
  </div>