Чтение в подмножестве столбцов CSV по имени

#r #tidyverse #read.table #read.csv

#r #tidyverse #read.table #read.csv

Вопрос:

У меня есть десятки файлов CSV различной длины. Некоторые файлы CSV содержат 18 столбцов, а некоторые другие — 9. Они используют один и тот же набор имен столбцов. Я хотел бы прочитать в некоторых столбцах каждого файла по имени переменной.

Вот небольшой пример того, с чем я имею дело.

 df1 <- tibble(a = 1:2, b = letters[1:2], c = NA, e=7:8)
df2 <- tibble(a = 8:9, b = letters[7:8], e = 8:9, c = NA)
df3 <- tibble(a = 8:9, b = letters[7:8], c = NA, d=5:6, e=7:8) 
  

Я хотел бы извлечь столбцы a, b И e. Я не могу указать позицию столбца, потому что они находятся в разных позициях в каждом наборе данных. Мне нужно было бы использовать имена переменных в каждом файле для чтения в этих столбцах.

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

 read_fun = function(path){
  test = read.csv(path, sep=",", header=F, fill = TRUE, colClasses = c(rep("NULL",2), "character",rep("NULL",2),
                                                                                   rep("character",14), rep("NULL",5)),
                  skip = 1, nrows = 17)
  test$question = path
  test
}
  

Я знаю, что col.names позволяет вам переименовывать столбцы по мере их чтения, для меня это бесполезно.

Есть ли у R способ чтения в файлах по имени переменной каждого файла?

Что-то вроде:

 test = read.csv("fileA.csv", sep = ",", col_names = c("a","b","e"))
  

Любая помощь, пожалуйста!

Комментарии:

1. … одним из вариантов может быть vroom пакет. функция vroom::vroom позволяет выбирать столбцы с помощью аргумента col_select ,

2. Как правильно читать каждый файл (полностью), затем подмножествовать столбцы a, b И e и возвращать все это в виде списка или фрейма данных?

3. @stefan Я не могу использовать vroom для чтения файлов в can I? Я могу использовать его только для работы с файлом после того, как он был прочитан?

4. @Liman, у меня есть десятки файлов, мне нужно прочитать их сразу, а затем связать их после этого, я не могу связать файлы разной длины:(

5. @NewBee. Конечно, вы можете прочитать файлы с помощью vroom::vroom. Вот для чего это предназначено. (; Я проверил. Считывает только столбцы, указанные вами через col_select . Попробуйте.

Ответ №1:

Если каждый файл не такой большой и для чтения не требуется времени, стратегия «сначала прочитай и выбери» будет работать. В случае, если автоматическое определение типа не работает должным образом, вам может потребоваться добавить mutate в конце цепочки, чтобы настроить тип столбца.

 library(tidyverse)

read_fun <- function(path) {
  read_csv(path) %>%
    select(a, b, e)
}
  

Если вы хотите объединить все data.frame в один, используйте map_dfr :

 df_combined <-
  c("file1.csv", "file2.csv", "file3.csv") %>%
  map_dfr(funcion(path) {
    read_csv(path) %>%
      select(a, b, e) %>%
      mutate(a = as.numeric(a),
             b = as.character(b),
             e = as.numeric(e))
  })
  

Ответ №2:

Вместо фильтрации сообщений, как в предыдущем ответе @teru, фильтрация по времени чтения доступна с readr 2.0.0 (выпущен в июле 2021):

 read_csv(path, col_select = c("a", "b", "e"))
  

readr 2 основан на vroom, так что это просто выбор пути, который @stefan отметил в комментариях к OP.