создавать группы в списке на основе значений в файлах r и rbind в списках - PullRequest
1 голос
/ 04 марта 2020

Пожалуйста, смотрите часть списка ниже. Список фактически охватывает период с 19800101 по 20161231. Во-первых, я хочу создать группы на основе года, т. Е. Поместить элементы 19800101-19801231 в одну группу с именем 1980 и так далее. Затем я бы связал эти маленькие файлы в каждой группе как один большой файл, скажем, от 19800101 до 19801231 как один файл 1980.

Есть идеи? Спасибо!

   [1] "19800101.csv" "19800102.csv" "19800103.csv" "19800104.csv" "19800105.csv" "19800106.csv" "19800107.csv"
   [8] "19800108.csv" "19800109.csv" "19800110.csv" "19800111.csv" "19800112.csv" "19800113.csv" "19800114.csv"
  [15] "19800115.csv" "19800116.csv" "19800117.csv" "19800118.csv" "19800119.csv" "19800120.csv" "19800121.csv"
  [22] "19800122.csv" "19800123.csv" "19800124.csv" "19800125.csv" "19800126.csv" "19800127.csv" "19800128.csv"
  [29] "19800129.csv" "19800130.csv" "19800131.csv" "19800201.csv" "19800202.csv" "19800203.csv" "19800204.csv"
  [36] "19800205.csv" "19800206.csv" "19800207.csv" "19800208.csv" "19800209.csv" "19800210.csv" "19800211.csv"
  [43] "19800212.csv" "19800213.csv" "19800214.csv" "19800215.csv" "19800216.csv" "19800217.csv" "19800218.csv"
  [50] "19800219.csv" "19800220.csv" "19800221.csv" "19800222.csv" "19800223.csv" "19800224.csv" "19800225.csv"
  [57] "19800226.csv" "19800227.csv" "19800228.csv" "19800229.csv" "19800301.csv" "19800302.csv" "19800303.csv"
  [64] "19800304.csv" "19800305.csv" "19800306.csv" "19800307.csv" "19800308.csv" "19800309.csv" "19800310.csv"
  [71] "19800311.csv" "19800312.csv" "19800313.csv" "19800314.csv" "19800315.csv" "19800316.csv" "19800317.csv"
  [78] "19800318.csv" "19800319.csv" "19800320.csv" "19800321.csv" "19800322.csv" "19800323.csv" "19800324.csv"
  [85] "19800325.csv" "19800326.csv" "19800327.csv" "19800328.csv" "19800329.csv" "19800330.csv" "19800331.csv"

1 Ответ

1 голос
/ 04 марта 2020

Мы можем split по первым 4 символам, используя substr в list из vector с.

lst1 <- split(v1, as.integer(substr(v1, 1, 4)))

К элементам list можно получить доступ [[ или $

lst1$`1980`

lst1$[["1980"]]

Затем мы можем прочитать над list и rbind наборы данных

lst2 <- lapply(lst1, function(x) do.call(rbind, lapply(x, read.csv)))

Если нам нужно записать его в CSV, не сохраняя его в list

library(readr)
for(nm in names(lst1)) {
      tmp <- data.frame()
      for(i in seq_along(lst1[[nm]]))  {
             tmp <- rbind(tmp, read_csv(lst1[[nm]][i]))
        }
       write_csv(tmp, path = paste0(nm, ".csv"))
       rm(tmp)
       }

Или с tidyverse

library(purrr)
library(readr)
library(dplyr)
lst2 <- map(lst1, ~ map_dfr(.x, read_csv))

Если вы хотите создать столбец группировки, используйте

df1 <- data.frame(v1)
df1$grp <- substr(df1$v1, 1,  4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...