R Language
Odczytywanie i zapisywanie danych tabelarycznych w plikach tekstowych (CSV, TSV itp.)
Szukaj…
Składnia
read.csv (plik, nagłówek = PRAWDA, sep = ",", quote = "" ", dec =". ", fill = PRAWDA, comment.char =" ", ...)
read.csv2 (plik, nagłówek = PRAWDA, sep = ";", quote = "" ", dec =", ", fill = PRAWDA, comment.char =" ", ...)
readr :: read_csv (file, 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", stringsAsFactors = FALSE, verbose = getOption ("datatable .verbose "), autostart = 1L, skip = 0L, select = NULL, drop = NULL, colClasses = NULL, integer64 = getOption (" datatable.integer64 "), # default:" integer64 "dec = if (sep! =" .) table = getOption ("datatable.fread.datatable") # default: TRUE)
Parametry
Parametr | Detale |
---|---|
plik | nazwa pliku CSV do odczytania |
nagłówek | logiczne: czy plik .csv zawiera wiersz nagłówka z nazwami kolumn? |
wrz | znak: symbol oddzielający komórki w każdym rzędzie |
zacytować | znak: symbol używany do cytowania ciągów znaków |
dec | znak: symbol używany jako separator dziesiętny |
napełnić | logiczne: gdy PRAWDA, wiersze o nierównej długości są wypełniane pustymi polami. |
comment.char | znak: znak używany jako komentarz w pliku csv. Linie poprzedzone tym znakiem są ignorowane. |
... | dodatkowe argumenty do przekazania do read.table |
Uwagi
Zauważ, że eksport do formatu zwykłego tekstu poświęca wiele informacji zakodowanych w danych, takich jak klasy zmiennych ze względu na szeroką przenośność. W przypadkach, które nie wymagają takiej przenośności, bardziej przydatny może być format .RData lub Wtapianie .
Dane wejściowe / wyjściowe dla innych typów plików są omówione w kilku innych tematach, wszystkie powiązane z danymi wejściowymi i wyjściowymi .
Importowanie plików .csv
Importowanie przy użyciu bazy R.
Pliki wartości rozdzielanych przecinkami (CSV) można importować za pomocą read.csv
, który otacza read.table
, ale używa sep = ","
aby ustawić separator na przecinek.
# 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
Przyjazna dla użytkownika opcja file.choose
pozwala przeglądać katalogi:
df <- read.csv(file.choose())
Notatki
- W przeciwieństwie do
read.table
,read.csv
domyślnie maheader = TRUE
i używa pierwszego wiersza jako nazw kolumn. - Wszystkie te funkcje domyślnie konwertują ciągi znaków na klasę
factor
chyba żeas.is = TRUE
lubstringsAsFactors = FALSE
. - Wariant
read.csv2
domyślnie ma wartośćsep = ";"
idec = ","
do wykorzystania w danych z krajów, w których przecinek jest używany jako przecinek dziesiętny, a średnik jako separator pól.
Importowanie za pomocą pakietów
Funkcja readr
pakietu read_csv
oferuje znacznie większą wydajność, pasek postępu dla dużych plików i bardziej popularne domyślne opcje niż standardowe read.csv
, w tym 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
Importowanie z data.table
Pakiet data.table
wprowadza funkcję fread
. Chociaż jest podobny do read.table
, fread
jest zwykle szybszy i bardziej elastyczny, automatycznie zgadując ogranicznik pliku.
# 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
Gdzie argumentem input
jest ciąg znaków reprezentujący:
- nazwa pliku ( np.
"filename.csv"
), - polecenie powłoki, które działa na plik ( np.
"grep 'word' filename"
) lub - samo wejście ( np.
"input1, input2 \n A, B \n C, D"
).
fread
zwraca obiekt klasy data.table
który dziedziczy z klasy data.frame
, odpowiedni do użycia z użyciem data.table []
. Aby zwrócić zwykłą ramkę data.frame, ustaw parametr data.table
na 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
Notatki
-
fread
nie ma wszystkich takich samych opcji jakread.table
. Jednym brakującym argumentem jestna.comment
, który może prowadzić do niepożądanych zachowań, jeśli plik źródłowy zawiera#
. -
fread
używa tylko"
jako parametruquote
. -
fread
używa kilku (5) linii do odgadnięcia typów zmiennych.
Importowanie plików .tsv jako matryc (podstawowy R)
Wiele osób nie korzysta z file.path
podczas tworzenia ścieżki do pliku. Ale jeśli pracujesz na komputerach z systemami Windows, Mac i Linux, zwykle dobrą praktyką jest używanie go do tworzenia ścieżek zamiast paste
.
FilePath <- file.path(AVariableWithFullProjectPath,"SomeSubfolder","SomeFileName.txt.gz")
Data <- as.matrix(read.table(FilePath, header=FALSE, sep ="\t"))
Zasadniczo jest to wystarczające dla większości ludzi.
Czasami zdarza się, że wymiary macierzy są tak duże, że procedura przydziału pamięci musi być brana pod uwagę podczas odczytu w macierzy, co oznacza czytanie w matrycy linia po linii.
Weźmy poprzedni przykład: W tym przypadku FilePath
zawiera plik o wymiarze 8970 8970
z 79% komórek zawierających wartości niezerowe.
system.time(expr=Data<-as.matrix(read.table(file=FilePath,header=FALSE,sep=" ") ))
system.time
mówi, że odczytanie pliku zajęło 267 sekund.
user system elapsed
265.563 1.949 267.563
Podobnie ten plik można odczytać wiersz po wierszu,
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
Istnieje również pakiet futile.matrix
, który implementuje metodę read.matrix
, sam kod ujawni się jako taki sam, jak opisano w przykładzie 1.
Eksportowanie plików .csv
Eksportowanie przy użyciu bazy R.
Dane można zapisać do pliku CSV za pomocą write.csv()
:
write.csv(mtcars, "mtcars.csv")
Powszechnie określone parametry to row.names = FALSE
i na = ""
.
Eksportowanie przy użyciu pakietów
readr::write_csv
jest znacznie szybszy niż write.csv
i nie zapisuje nazw wierszy.
library(readr)
write_csv(mtcars, "mtcars.csv")
Zaimportuj wiele plików csv
files = list.files(pattern="*.csv")
data_list = lapply(files, read.table, header = TRUE)
Odczytuje każdy plik i dodaje go do listy. Następnie, jeśli wszystkie data.frame mają tę samą strukturę, można je połączyć w jedną dużą data.frame:
df <- do.call(rbind, data_list)
Importowanie plików o stałej szerokości
Pliki o stałej szerokości są pliki tekstowe, w których kolumny nie są oddzielone dowolną separator, jak ,
lub ;
, ale mają raczej stałą długość ( szerokość ). Dane są zwykle uzupełniane białymi spacjami.
Przykład:
Column1 Column2 Column3 Column4Column5
1647 pi 'important' 3.141596.28318
1731 euler 'quite important' 2.718285.43656
1979 answer 'The Answer.' 42 42
Załóżmy, że ta tabela danych istnieje w lokalnym pliku constants.txt
w katalogu roboczym.
Importowanie z bazą 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
Uwaga:
- Tytuły kolumn nie muszą być oddzielane znakiem (
Column4Column5
) - Parametr
widths
określa szerokość każdej kolumny -
read.fwf()
nagłówków nie można odczytać za pomocąread.fwf()
Importowanie za pomocą czytnika
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
Uwaga:
- Funkcje pomocnicze readw
fwf_*
oferują alternatywne sposoby określania długości kolumn, w tym automatyczne zgadywanie (fwf_empty
) - readr jest szybszy niż podstawa R.
- Tytułów kolumn nie można automatycznie importować z pliku danych