импортировать папку с несколькими CSV-файлами и манипулировать всеми данными одновременно в R - PullRequest
0 голосов
/ 30 января 2020

У меня есть папка с 100 различными файлами .csv. Не все файлы содержат одинаковое количество переменных (различную структуру), поэтому я пытаюсь импортировать их все сразу и (создать отдельный фрейм данных для каждого CSV), а затем стандартизировать фреймы данных, добавив новый столбец или преобразовать столбец даты из символа в дату и экспортировать их сразу же в конце. Вот моя попытка, он будет работать для чтения всех CSV как отдельный фрейм данных

setwd(C:/Users/...)
files <- list.files(pattern="*.csv")
for(file in files)
{
  perpos <- which(strsplit(file, "")[[1]]==".")
  assign(
    gsub(" ","",substr(file, 1, perpos-1)), 
    read.csv(paste(path,file,sep="")))
} 

Однако, когда я добавляю функцию mutate в assign для добавления нового столбца, например, скрипт будет запустить, но не добавит ни одного столбца! Что мне здесь не хватает? Моя цель - добавить / манипулировать некоторыми переменными и снова экспортировать их, желательно в пределах tidyverse

for(file in files)
{
  perpos <- which(strsplit(file, "")[[1]]==".")
  assign(
    gsub(" ","",substr(file, 1, perpos-1)), 
    read_csv(paste(path,file,sep="")),
    mutate(. , Heading = "Data"))
} 

Пример

df1 <- structure(list(datadate = structure(c(17927, 17927, 17927, 17927, 
17927, 17927), class = "Date"), parent = c("grup", "grup", 
"grup", "grup", "grup", "grup"), ads = c("P9", 
"PS8", "PS7", "PS6", "PS5", "PS5"), chl = c("PSS9", 
"PSS8", "PSS7", "PSS6", "PSS5", "PSS5"), 
    average_monthly = c(196586.49, 289829.43, 
    1363529.14, 380446.43, 147296.09, 948669.38), current_month = c(987118.82, 
    1682872.03, 4356755.73, 2225040.29, 922506.21, 5756525.08
    ), current_month_minus_1 = c(585573.1, 
    635763.37, 6551477.37, 818531.11, 255862.51, 1832829.99), 
    current_month_minus_2 = c(0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-6L))

df2<-
  structure(
    list(
      network = c("STAR", "NPD", "GMD"),
      datadate = structure(c(18259, 18259, 18259)),
      brand = c("grup", "GFK", "MDG"),
      average_weekly = c(140389.14,
                                           10281188.25, 172017.39),
      last_week_avg = c(89303.07,
                                         6918460.99, 110594.64),
      last_week_1_minus_avg = c(141765.83,
                                                 10248501.1, 222484.9),
      last_week_2_minus_avg = c(138043.53,
                                                 9846538.57, 164185.21)

    ),
    class = c("tbl_df", "tbl", "data.frame"),
    row.names = c(NA, -3L)
  )

Ответы [ 2 ]

1 голос
/ 30 января 2020

Помимо дизайна вашего кода, кажется, что вы используете mutate неправильный путь.

В вашем коде вы помещаете вызов mutate в качестве 3-го аргумента assign функция, которая должна быть позицией (окружением вашей переменной).

Что вы действительно хотите написать, это:

assign(
  gsub(" ","",substr(file, 1, perpos-1)), 
  read_csv(paste(path,file,sep="")) %>% 
    mutate(Heading = "Data"))
} 

Если вы не знакомы с каналом оператор (%>%), я предлагаю вам прочитать некоторые учебные пособия, такие как dplyr виньетка , в которой есть параграф.

Этот код означает: присваивать переменной, названной в честь gsub вызовите фрейм данных, прочитанный из csv, после изменения его, чтобы добавить столбец Heading.

Но, как и в ответе hello_friend, я призываю вас переосмыслить свой дизайн для работы со списками а не куча переменных. Для этого tidyverse можно использовать пакет purrr

1 голос
/ 30 января 2020

Решение Base R для чтения файлов в список, изменения, необходимые для их объединения, зависят от ваших данных:

# Store a scalar of the path containing the csvs: 

example_dir <- "C:/Users/Example_Dir"

# Create a vector of the csv paths: 

files <- file.path(example_dir, list.files(example_dir, pattern = ".*.csv"))

# Create an empty list the same length as the number of files: 

X <- vector("list", length(files))

# Iterate through the files and store them in a list:

X[] <- lapply(seq_along(files), function(i){

    data.frame(read.csv(files[i]), stringsAsFactors = FALSE)

  }
)
...