0Pricing
R Academy · Lekcja

Zapisywanie danych w wielu formatach

Eksportuj ramki danych do formatów CSV, Excel i RDS za pomocą write_csv() i writexl.

Zapisywanie danych w wielu formatach to bezpłatna lekcja R Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

Zapisywanie danych z R

Odczytywanie danych to tylko połowa zadania — należy również zapisywać wyniki. R obsługuje wiele formatów wyjściowych: CSV zapewniający uniwersalną zgodność, RDS umożliwiający dokładne zachowanie obiektów R, Parquet przeznaczony do wydajnej analityki i wiele innych. Format należy wybrać w zależności od odbiorców i zastosowania.

library(readr)

# Create a sample data frame to write
df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85.5, 92.0, 78.3),
  grade = c('B','A','C'),
  passed = c(TRUE, TRUE, TRUE)
)

print(df)
cat('\nWe will save this in multiple formats!')

write_csv() — zapisywanie jako CSV

write_csv(df, 'file.csv') zapisuje ramkę danych jako plik rozdzielany przecinkami. Domyślnie NIE zapisuje nazw wierszy (w przeciwieństwie do write.csv()). Wynik jest zawsze kodowany w UTF-8. Funkcja niewidocznie zwraca ramkę danych, dlatego można jej używać w potokach.

library(readr)

df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85, 92, 78)
)

# Write to /tmp for demonstration
write_csv(df, '/tmp/students.csv')

# Verify by reading back
read_csv('/tmp/students.csv', show_col_types=FALSE)

Opcje write_csv()

write_csv() przyjmuje kilka opcji: na='NA' określa sposób zapisywania wartości NA, append=TRUE dopisuje dane do istniejącego pliku, col_names=FALSE pomija nagłówek, a quote określa, kiedy ujmować pola w cudzysłowy.

library(readr)

df <- data.frame(
  name = c('Alice','Bob'),
  city = c('New York','Los,Angeles'),  # Contains comma
  score = c(85, NA)
)

# na='' writes NA as empty string (common Excel convention)
write_csv(df, '/tmp/test_write.csv', na='')
cat(paste(read_lines('/tmp/test_write.csv'), collapse='\n'))

write_tsv() — dane rozdzielane tabulatorami

write_tsv(df, 'file.tsv') zapisuje dane w formacie rozdzielanym tabulatorami. Ten format jest preferowany, gdy dane zawierają przecinki lub gdy system docelowy wymaga formatu TSV. Obowiązują te same opcje co w write_csv().

library(readr)

df <- data.frame(
  address = c('123 Main St, NYC','456 Oak Ave, LA'),
  score = c(85, 92)
)

# TSV avoids delimiter conflict with commas in addresses
write_tsv(df, '/tmp/addresses.tsv')
cat(paste(read_lines('/tmp/addresses.tsv'), collapse='\n'))

saveRDS() — zapisywanie dowolnego obiektu R

saveRDS(obj, 'file.rds') szereguje dowolny obiekt R i zapisuje go na dysku w natywnym binarnym formacie R. readRDS('file.rds') odtwarza go dokładnie, zachowując typy kolumn, czynniki, atrybuty, a nawet obiekty modeli. Format nie jest czytelny dla człowieka, ale można go bez problemu przenosić między sesjami R.

library(readr)

df <- data.frame(
  name = c('Alice','Bob'),
  score = c(85.5, 92.0),
  grade = factor(c('B','A'), levels=c('A','B','C','D'))
)

# Save with full type preservation
saveRDS(df, '/tmp/students.rds')

# Restore exactly
df2 <- readRDS('/tmp/students.rds')
print(df2)
print(class(df2$grade))  # factor — preserved!

saveRDS() a save() — najważniejsza różnica

saveRDS(obj, 'file.rds') zapisuje pojedynczy obiekt bez jego nazwy. readRDS() pozwala przypisać mu dowolną nazwę. save(obj1, obj2, 'file.RData') zapisuje wiele nazwanych obiektów; load() odtwarza je pod oryginalnymi nazwami (może nadpisać istniejące zmienne).

# saveRDS: single object, flexible on load
model <- lm(mpg ~ wt, data=mtcars)
saveRDS(model, '/tmp/my_model.rds')
best_model <- readRDS('/tmp/my_model.rds')  # Any name!
cat('R-squared:', round(summary(best_model)$r.squared, 3), '\n')

# save: multiple named objects, fixed names on load
# save(model, mtcars, file='/tmp/workspace.RData')
# load('/tmp/workspace.RData')  # Restores 'model' and 'mtcars'

write_delim() — niestandardowy separator

write_delim(df, file, delim='|') zapisuje dane z użyciem dowolnego separatora. Należy użyć tej funkcji, gdy system docelowy wymaga formatu rozdzielanego pionowymi kreskami lub innego niestandardowego formatu. Obowiązują te same gwarancje jakości danych co w write_csv().

library(readr)

df <- data.frame(
  id = 1:3,
  name = c('Alice','Bob','Carol'),
  value = c(100, 200, 150)
)

# Write pipe-delimited
write_delim(df, '/tmp/data.psv', delim='|')
cat(paste(read_lines('/tmp/data.psv'), collapse='\n'))

Zapisywanie do plików Excel za pomocą writexl

Pakiet writexl (uzupełniający pakiet readxl) zapisuje ramki danych w formacie .xlsx: writexl::write_xlsx(df, 'file.xlsx'). Aby zapisać wiele arkuszy, należy przekazać nazwaną listę. Nie jest wymagana instalacja Javy ani programu Excel.

# writexl::write_xlsx() — example (library not always available)
# library(writexl)

df1 <- data.frame(name=c('Alice','Bob'), score=c(85,92))
df2 <- data.frame(region=c('East','West'), sales=c(100,200))

# Single sheet:
# write_xlsx(df1, '/tmp/students.xlsx')

# Multiple sheets (named list):
# write_xlsx(
#   list(students=df1, sales=df2),
#   '/tmp/report.xlsx'
# )

cat('writexl writes pure .xlsx without Java or Excel!')

Pliki Parquet za pomocą arrow

Apache Parquet to kolumnowy format przechowywania danych, idealny dla dużych zbiorów: dobrze się kompresuje i umożliwia znacznie szybszy odczyt niż CSV w przypadku zapytań ukierunkowanych na kolumny. Pakiet arrow udostępnia funkcje write_parquet() i read_parquet().

# arrow::write_parquet() concept
# library(arrow)

# Large CSV -> Parquet (10-100x smaller, 10-100x faster reads)
# df <- read_csv('big_file.csv')
# write_parquet(df, 'big_file.parquet')
# df_back <- read_parquet('big_file.parquet')

# Parquet benefits:
# - Columnar: only reads columns you need
# - Compressed: ~10x smaller than CSV
# - Typed: no type re-guessing on read
# - Partitioned: split by date/region for parallel reads

cat('Parquet is the modern standard for large-scale analytics in R!')

Zapisywanie danych w potoku

Zarówno write_csv(), jak i saveRDS() niewidocznie zwracają przekazane dane, dzięki czemu można ich używać wewnątrz potoku bez przerywania jego działania. Aby zapewnić odtwarzalność, należy wstawić w środku potoku etap zapisu za pomocą punktu kontrolnego write_csv().

library(readr)
library(dplyr)

# Write mid-pipeline as a checkpoint
final_result <- data.frame(
  region=c('East','West','North'),
  sales=c(100,200,80)
) %>%
  mutate(pct = round(100*sales/sum(sales),1)) %>%
  {. ->> checkpoint_df; .} %>%  # Save checkpoint
  filter(sales > 90)

write_csv(checkpoint_df, '/tmp/checkpoint.csv')
print(final_result)

Przewodnik po wyborze formatu

Wybór właściwego formatu wyjściowego zależy od celu:

  • CSV/TSV: uniwersalne, czytelne dla człowieka, można je otworzyć w dowolnym programie
  • RDS: do wymiany między R, dokładnie zachowuje wszystkie typy i atrybuty
  • xlsx: dla użytkowników biznesowych korzystających z programu Excel
  • Parquet: dla dużych zbiorów danych, potoków analitycznych i systemów produkcyjnych
  • JSON: dla interfejsów API oraz danych zagnieżdżonych i hierarchicznych (jsonlite::toJSON())
library(readr)

df <- data.frame(
  id = 1:5,
  value = c(10.5, 20.3, 15.7, 30.1, 25.8)
)

# CSV — universal
write_csv(df, '/tmp/data.csv')

# TSV — when commas are in data
write_tsv(df, '/tmp/data.tsv')

# RDS — R-native, type-preserving
saveRDS(df, '/tmp/data.rds')

cat('Files created:\n')
cat('CSV size:', file.size('/tmp/data.csv'), 'bytes\n')
cat('RDS size:', file.size('/tmp/data.rds'), 'bytes\n')

Szybkie sprawdzenie

Jaka jest najważniejsza przewaga saveRDS() nad write_csv() podczas zapisywania danych R?

Podsumowanie: zapisywanie danych

Najważniejsze informacje dotyczące zapisywania danych z R:

  • write_csv(df, 'file.csv') — dane rozdzielane przecinkami, bez nazw wierszy, kodowanie UTF-8
  • write_tsv(df, 'file.tsv') — dane rozdzielane tabulatorami
  • write_delim(df, file, delim='|') — dowolny separator
  • saveRDS(obj, 'file.rds') — binarny format R, zachowuje wszystkie typy
  • readRDS('file.rds') — umożliwia przywrócenie dowolnej nazwy; load() przywraca oryginalne nazwy
  • writexl::write_xlsx() — zapis do formatu Excel, bez konieczności instalowania Javy
  • arrow::write_parquet() — kolumnowy format dla dużych zbiorów danych analitycznych
library(readr)

df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85.5, 92.0, 78.3),
  grade = factor(c('B','A','C'))
)

# CSV: universal but loses factor
write_csv(df, '/tmp/demo.csv')
df_csv <- read_csv('/tmp/demo.csv', show_col_types=FALSE)
cat('CSV grade type:', class(df_csv$grade), '\n')  # character

# RDS: preserves factor
saveRDS(df, '/tmp/demo.rds')
df_rds <- readRDS('/tmp/demo.rds')
cat('RDS grade type:', class(df_rds$grade))  # factor

Często zadawane pytania

Czy lekcja „Zapisywanie danych w wielu formatach” jest bezpłatna?

Tak — pełny tekst „Zapisywanie danych w wielu formatach” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Zapisywanie danych w wielu formatach”?

Eksportuj ramki danych do formatów CSV, Excel i RDS za pomocą write_csv() i writexl. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Zapisywanie danych w wielu formatach”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Odczytywanie plików CSV za pomocą read_csv()
  2. Parsowanie plików TSV i plików o stałej szerokości
  3. Importowanie plików Excela za pomocą readxl
  4. Zapisywanie danych w wielu formatach
← Powrót do R Academy