R Language
Чтение и запись табличных данных в текстовых файлах (CSV, TSV и т. Д.)
Поиск…
Синтаксис
read.csv (file, header = TRUE, sep = ",", quote = "" ", dec =". ", fill = TRUE, comment.char =" ", ...)
read.csv2 (file, header = TRUE, sep = ";", quote = "" ", dec =", ", fill = TRUE, comment.char =" ", ...)
readr :: read_csv (файл, col_names = TRUE, col_types = NULL, locale = default_locale (), na = c ("", "NA"), comment = "", trim_ws = TRUE, skip = 0, n_max = -1 , progress = interactive ())
data.table :: fread (input, sep = "auto", sep2 = "auto", nrows = -1L, header = "auto", na.strings = "NA", strAsAsFactors = FALSE, verbose = getOption ("datatable .wowbose "), autostart = 1L, skip = . ")". else ",", col.names, check.names = FALSE, encoding = "unknown", strip.white = TRUE, showProgress = getOption ("datatable.showProgress"), # default: ИСТИНА. table = getOption ("datatable.fread.datatable") # default: TRUE)
параметры
параметр | подробности |
---|---|
файл | имя файла CSV для чтения |
заголовок | логически: содержит ли файл .csv строку заголовка с именами столбцов? |
сентябрь | символ: символ, который разделяет ячейки на каждой строке |
котировка | символ: символ, используемый для указания символьных строк |
декабрь | символ: символ, используемый как десятичный разделитель |
заполнить | логическое: если TRUE, строки с неравной длиной заполняются пустым полем. |
comment.char | character: character используется как комментарий в файле csv. Строки, которым предшествует этот символ, игнорируются. |
... | дополнительные аргументы, которые необходимо передать read.table |
замечания
Обратите внимание, что экспорт в текстовый формат жертвует большей частью информации, закодированной в таких данных, как переменные классы, для широкой переносимости. Для случаев, которые не требуют такой переносимости, формат, например .RData или Feather, может быть более полезным.
Ввод / вывод для других типов файлов описывается несколькими другими темами, связанными с входом и выходом .
Импорт файлов .csv
Импорт с использованием базы R
Файлы значений с разделителями-запятыми (CSV) можно импортировать с помощью read.csv
, который обертывает read.table
, но использует sep = ","
чтобы установить разделитель в запятую.
# get the file path of a CSV included in R's utils package
csv_path <- system.file("misc", "exDIF.csv", package = "utils")
# path will vary based on installation location
csv_path
## [1] "/Library/Frameworks/R.framework/Resources/library/utils/misc/exDIF.csv"
df <- read.csv(csv_path)
df
## Var1 Var2
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Удобный для пользователя вариант, file.choose
, позволяет просматривать каталоги:
df <- read.csv(file.choose())
Заметки
- В отличие от
read.table
,read.csv
умолчанию имеет значениеheader = TRUE
и использует первую строку как имена столбцов. - Все эти функции будут преобразовывать строки в класс
factor
по умолчанию, если толькоas.is = TRUE
илиstringsAsFactors = FALSE
. - Вариант
read.csv2
умолчанию имеет значениеsep = ";"
иdec = ","
для использования в данных из стран, где запятая используется как десятичная точка и точка с запятой как разделитель полей.
Импорт с использованием пакетов
В readr
ПАКЕТ в read_csv
функция предлагает гораздо более высокую производительность, индикатор выполнения для больших файлов, а также более популярные опции по умолчанию , чем стандартный read.csv
, включая stringsAsFactors = FALSE
.
library(readr)
df <- read_csv(csv_path)
df
## # A tibble: 4 x 2
## Var1 Var2
## <dbl> <chr>
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Импорт с помощью data.table
Пакет data.table
вводит функцию fread
. Хотя он похож на read.table
, fread
обычно быстрее и гибче, угадывая разделитель файла автоматически.
# get the file path of a CSV included in R's utils package
csv_path <- system.file("misc", "exDIF.csv", package = "utils")
# path will vary based on R installation location
csv_path
## [1] "/Library/Frameworks/R.framework/Resources/library/utils/misc/exDIF.csv"
dt <- fread(csv_path)
dt
## Var1 Var2
## 1: 2.70 A
## 2: 3.14 B
## 3: 10.00 A
## 4: -7.00 A
Где input
аргумента представляет собой строку, представляющую:
- имя файла ( например,
"filename.csv"
), - команда оболочки, которая действует на файл ( например,
"grep 'word' filename"
) или - сам вход ( например,
"input1, input2 \n A, B \n C, D"
).
fread
возвращает объект класса data.table
который наследует класс data.frame
, подходящий для использования с использованием data.table []
. Чтобы вернуть обычный data.frame, установите для параметра data.table
значение FALSE
:
df <- fread(csv_path, data.table = FALSE)
class(df)
## [1] "data.frame"
df
## Var1 Var2
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Заметки
-
fread
не имеет всех параметров, таких какread.table
. Один отсутствующий аргумент -na.comment
, что может привести к нежелательному поведению, если исходный файл содержит#
. -
fread
использует только"
для параметраquote
. -
fread
использует несколько (5) строк для определения типов переменных.
Импорт файлов .tsv в виде матриц (базовый R)
Многие люди не используют file.path
при создании пути к файлу. Но если вы работаете на машинах Windows, Mac и Linux, обычно рекомендуется использовать их для создания путей вместо paste
.
FilePath <- file.path(AVariableWithFullProjectPath,"SomeSubfolder","SomeFileName.txt.gz")
Data <- as.matrix(read.table(FilePath, header=FALSE, sep ="\t"))
Обычно этого достаточно для большинства людей.
Иногда бывает, что размеры матрицы настолько велики, что при расчете в матрице необходимо учитывать процедуру распределения памяти, что означает чтение в матрице по строкам.
Возьмем предыдущий пример. В этом случае FilePath
содержит файл размером 8970 8970
с 79% ячеек, содержащих ненулевые значения.
system.time(expr=Data<-as.matrix(read.table(file=FilePath,header=FALSE,sep=" ") ))
system.time
говорит, что 267 секунд были взяты для чтения файла.
user system elapsed
265.563 1.949 267.563
Аналогично, этот файл можно читать по строкам,
FilePath <- "SomeFile"
connection<- gzfile(FilePath,open="r")
TableList <- list()
Counter <- 1
system.time(expr= while ( length( Vector<-as.matrix(scan(file=connection, sep=" ", nlines=1, quiet=TRUE)) ) > 0 ) {
TableList[[Counter]]<-Vector
Counter<-Counter+1
})
user system elapsed
165.976 0.060 165.941
close(connection)
system.time(expr=(Data <- do.call(rbind,TableList)))
user system elapsed
0.477 0.088 0.565
Существует также пакет futile.matrix
, который реализует метод read.matrix
, сам код будет показывать то же самое, что описано в примере 1.
Экспорт файлов .csv
Экспорт с использованием базы R
Данные могут быть записаны в CSV-файл с помощью write.csv()
:
write.csv(mtcars, "mtcars.csv")
Обычно заданные параметры включают row.names = FALSE
и na = ""
.
Экспорт с использованием пакетов
readr::write_csv
значительно быстрее, чем write.csv
и не записывает имена строк.
library(readr)
write_csv(mtcars, "mtcars.csv")
Импортировать несколько файлов csv
files = list.files(pattern="*.csv")
data_list = lapply(files, read.table, header = TRUE)
Это читает каждый файл и добавляет его в список. Впоследствии, если все data.frame имеют одинаковую структуру, их можно объединить в один большой файл data.frame:
df <- do.call(rbind, data_list)
Импорт файлов фиксированной ширины
Файлы с фиксированной шириной - это текстовые файлы, в которых столбцы не разделены каким-либо разделителем символов, например ,
или ;
, но имеют фиксированную длину символа ( ширину ). Обычно данные заполняются пробелами.
Пример:
Column1 Column2 Column3 Column4Column5
1647 pi 'important' 3.141596.28318
1731 euler 'quite important' 2.718285.43656
1979 answer 'The Answer.' 42 42
Предположим, что эта таблица данных существует в локальном файле constants.txt
в рабочем каталоге.
Импорт с базой R
df <- read.fwf('constants.txt', widths = c(8,10,18,7,8), header = FALSE, skip = 1)
df
#> V1 V2 V3 V4 V5
#> 1 1647 pi 'important' 3.14159 6.28318
#> 2 1731 euler 'quite important' 2.71828 5.43656
#> 3 1979 answer 'The Answer.' 42 42.0000
Замечания:
- Названия столбцов не должны разделяться символом (
Column4Column5
) - Параметр
widths
определяет ширину каждого столбца - Не разделенные заголовки не читаются с помощью
read.fwf()
Импорт с помощью readr
library(readr)
df <- read_fwf('constants.txt',
fwf_cols(Year = 8, Name = 10, Importance = 18, Value = 7, Doubled = 8),
skip = 1)
df
#> # A tibble: 3 x 5
#> Year Name Importance Value Doubled
#> <int> <chr> <chr> <dbl> <dbl>
#> 1 1647 pi 'important' 3.14159 6.28318
#> 2 1731 euler 'quite important' 2.71828 5.43656
#> 3 1979 answer 'The Answer.' 42.00000 42.00000
Замечания:
- Функции readw's
fwf_*
helper предоставляют альтернативные способы указания длины столбцов, включая автоматическое угадывание (fwf_empty
) - readr быстрее, чем база R
- Заголовки столбцов не могут быть автоматически импортированы из файла данных