#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.