R Language
Läsa och skriva tabelldata i vanliga textfiler (CSV, TSV, etc.)
Sök…
Syntax
read.csv (fil, rubrik = SANT, sep = ",", offert = "" ", dek =". ", fyll = SANT, kommentar.char =" ", ...)
read.csv2 (fil, rubrik = SANT, sep = ";", offert = "" ", dek =", ", fyll = SÄTT, kommentar.char =" ", ...)
readr :: read_csv (fil, col_names = TRUE, col_types = NULL, locale = default_locale (), na = c ("", "NA"), comment = "", trim_ws = TRUE, hoppa = 0, n_max = -1 , framsteg = interaktiv ())
data.table :: fread (input, sep = "auto", sep2 = "auto", nrows = -1L, header = "auto", na.strings = "NA", stringsAsFactors = FALSE, verbose = getOption ("datatable .verbose "), autostart = 1L, hoppa = 0L, välj = NULL, släpp = NULL, colClasses = NULL, integer64 = getOption (" datatable.integer64 "), # standard:" integer64 "dec = if (sep! =" . ")". "annars", ", col.names, check.names = FALSE, kodning =" okänd ", strip.white = TRUE, showProgress = getOption (" datatable.showProgress "), # standard: TRUE data. tabell = getOption ("datatable.fread.datatable") # standard: SANT)
parametrar
Parameter | detaljer |
---|---|
fil | namn på CSV-filen som ska läsas |
rubrik | logiskt: innehåller .csv-filen en rubrikrad med kolumnnamn? |
september | karaktär: symbol som skiljer cellerna på varje rad |
Citat | karaktär: symbol som används för att citera teckensträngar |
december | karaktär: symbol som används som decimalavskiljare |
fylla | logiskt: när det är SANT fylls rader med ojämn längd med tomma fält. |
comment.char | karaktär: tecken som används som kommentar i csv-filen. Linjer som föregås av denna karaktär ignoreras. |
... | extra argument som ska överföras till read.table |
Anmärkningar
Observera att export till ett vanligt textformat ofrar mycket av den information som är kodad i datan, som variabla klasser för bred portabilitet. För fall som inte kräver sådan portabilitet kan ett format som .RData eller Feather vara mer användbart.
Input / output för andra typer av filer täcks av flera andra ämnen, alla länkade från Input och output .
Importerar .csv-filer
Import med bas R
Kommaseparerade värdefiler (CSV) kan importeras med read.csv
, som read.table
, men använder sep = ","
att ställa in avgränsaren till ett komma.
# 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
Ett användarvänligt alternativ, file.choose
, låter file.choose
bläddra igenom katalogerna:
df <- read.csv(file.choose())
anteckningar
- Till skillnad från
read.table
ärread.csv
standardhuvudheader = TRUE
och använder den första raden som kolumnnamn. - Alla dessa funktioner kommer att konvertera strängar till
factor
klass som standard såvida inte antingenas.is = TRUE
ellerstringsAsFactors = FALSE
. - Varianten
read.csv2
standard försep = ";"
ochdec = ","
för användning på data från länder där komma används som decimalpunkt och semikolon som fältavskiljare.
Importerar med paket
readr
paketets read_csv
funktion erbjuder mycket snabbare prestanda, en framstegsfält för stora filer och mer populära standardalternativ än standard read.csv
, inklusive 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
Importerar med data.table
Paketet data.table
introducerar funktionen fread
. Även om det liknar read.table
, är fread
vanligtvis snabbare och mer flexibel, gissar filens avgränsare automatiskt.
# 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
Där argument input
är en sträng som representerar:
- filnamnet ( t.ex.
"filename.csv"
), - ett skalkommando som fungerar på en fil ( t.ex.
"grep 'word' filename"
), eller - själva ingången ( t.ex.
"input1, input2 \n A, B \n C, D"
).
fread
returnerar ett objekt av data.table
som ärver från data.frame
, lämpligt för användning med data.tabellens användning av []
. För att returnera en vanlig data.frame ställer data.table
parametern data.table
på 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
anteckningar
-
fread
har inte alla samma alternativ somread.table
. Ett saknat argument ärna.comment
, vilket kan leda till oönskat beteende om källfilen innehåller#
. -
fread
använder bara"
förquote
parameter. -
fread
använder få (5) rader för att gissa variabeltyper.
Importerar .tsv-filer som matriser (grundläggande R)
Många använder inte file.path
när de gör en sökväg till en fil. Men om du arbetar över Windows, Mac och Linux-maskiner är det vanligtvis bra att använda det för att skapa banor istället för att paste
.
FilePath <- file.path(AVariableWithFullProjectPath,"SomeSubfolder","SomeFileName.txt.gz")
Data <- as.matrix(read.table(FilePath, header=FALSE, sep ="\t"))
I allmänhet är detta tillräckligt för de flesta.
Ibland händer det att matrisdimensionerna är så stora att proceduren för minnesallokering måste beaktas vid läsning i matrisen, vilket innebär läsning i matrisen rad för rad.
Ta det föregående exemplet. I detta fall innehåller FilePath
en fil med dimension 8970 8970
med 79% av cellerna som innehåller icke-nollvärden.
system.time(expr=Data<-as.matrix(read.table(file=FilePath,header=FALSE,sep=" ") ))
system.time
säger att 267 sekunder togs för att läsa filen.
user system elapsed
265.563 1.949 267.563
På liknande sätt kan den här filen läsas rad för rad,
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
Det finns också futile.matrix
paketet som implementerar en read.matrix
metod, koden i sig kommer att avslöja sig vara samma sak som beskrivs i exempel 1.
Exporterar .csv-filer
Export med bas R
Data kan skrivas till en CSV-fil med write.csv()
:
write.csv(mtcars, "mtcars.csv")
Vanligt specificerade parametrar inkluderar row.names = FALSE
och na = ""
.
Export med paket
readr::write_csv
är betydligt snabbare än write.csv
och skriver inte write.csv
.
library(readr)
write_csv(mtcars, "mtcars.csv")
Importera flera csv-filer
files = list.files(pattern="*.csv")
data_list = lapply(files, read.table, header = TRUE)
Detta läser varje fil och lägger till den i en lista. Efteråt, om alla data.frame har samma struktur kan de kombineras till en big data.frame:
df <- do.call(rbind, data_list)
Importerar filer med fast bredd
Fast bredd filer är textfiler i vilka kolumner inte skiljs åt av alla tecken avgränsare, som ,
eller ;
, men snarare har en fast teckenlängd ( bredd ). Data är vanligtvis vadderade med vita utrymmen.
Ett exempel:
Column1 Column2 Column3 Column4Column5
1647 pi 'important' 3.141596.28318
1731 euler 'quite important' 2.718285.43656
1979 answer 'The Answer.' 42 42
Låt oss anta att denna datatabell finns i den lokala filen constants.txt
i arbetskatalogen.
Import med bas 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
Notera:
- Kolumntitlar behöver inte separeras med ett tecken (
Column4Column5
) -
widths
definierar bredden på varje kolumn - Icke separerade rubriker kan inte läsas med
read.fwf()
Importerar med 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
Notera:
- readrs
fwf_*
hjälpfunktioner erbjuder alternativa sätt att specificera kolumnlängder, inklusive automatisk gissning (fwf_empty
) - readr är snabbare än bas R
- Kolumntitlar kan inte importeras automatiskt från datafilen