Dodawanie i aktualizowanie kolumn przez referencję

Manipulacja danymi z data.table w R

Matt Dowle, Arun Srinivasan

Instructors, DataCamp

Wewnętrzna struktura data.frame

Załóżmy, że chcemy zmienić wartość w 2. wierszu kolumny "y" na 10

df <- data.frame(x = 1:5, y = 6:10)
df
x  y
1  6
2  7
df$y[2] <- 10
Manipulacja danymi z data.table w R

Wewnętrzna struktura data.frame

W R < v3.1.0 operacja ta powodowała głębokie skopiowanie całego data.frame

# what happens internally prior to R v3.1.0
tmp <- <deep copy of "df">
tmp$y[2] <- 10
df <- tmp
  • Co się stanie, jeśli ta sama operacja zostanie wykonana na data.frame o rozmiarze 10 GB?
Manipulacja danymi z data.table w R

Wewnętrzna struktura data.frame

  • W wersji 3.1.0 wprowadzono ulepszenie: głęboka kopia dotyczy tylko aktualizowanej kolumny

  • W tym przypadku głęboko kopiowane są tylko kolumny a i b podczas operacji na df poniżej

df <- data.frame(a = 1:3, b = 4:6, c = 7:9, d = 10:12)
df[1:2] <- lapply(df[1:2], function(x) ifelse(x%%2, x, NA))
df
 a  b c  d
 1 NA 7 10
NA  5 8 11
 3 NA 9 12
Manipulacja danymi z data.table w R

Wewnętrzna struktura data.table

  • data.table aktualizuje kolumny w miejscu, tj. przez referencję

  • Nie trzeba przypisywać wyniku z powrotem do zmiennej

  • Podczas zmiany wartości żadna kopia kolumny nie jest tworzona

  • data.table używa operatora := do dodawania/aktualizowania/usuwania kolumn przez referencję

Manipulacja danymi z data.table w R

Forma LHS := RHS

batrips[, c("is_dur_gt_1hour", "week_day") := list(duration > 3600, 
                                                   wday(start_date))]

# When adding a single column quotes aren't necessary batrips[, is_dur_gt_1hour := duration > 3600]
Manipulacja danymi z data.table w R

Forma funkcyjna

batrips[, `:=`(is_dur_gt_1hour = NULL,                  
               start_station = toupper(start_station))] 
Manipulacja danymi z data.table w R

Czas na ćwiczenia!

Manipulacja danymi z data.table w R

Preparing Video For Download...