참조를 통한 열 추가 및 업데이트

R의 data.table로 데이터 조작하기

Matt Dowle, Arun Srinivasan

Instructors, DataCamp

data.frame 내부 동작

열 "y"의 2번째 행 값을 10으로 변경하려 한다고 가정합니다.

df <- data.frame(x = 1:5, y = 6:10)
df
x  y
1  6
2  7
df$y[2] <- 10
R의 data.table로 데이터 조작하기

data.frame 내부 동작

R v3.1.0 이전에는 이 작업 시 전체 data.frame이 깊은 복사(deep copy)되었습니다.

# what happens internally prior to R v3.1.0
tmp <- <deep copy of "df">
tmp$y[2] <- 10
df <- tmp
  • 10GB 크기의 data.frame에 동일한 작업을 수행하면 어떻게 될까요?
R의 data.table로 데이터 조작하기

data.frame 내부 동작

  • v3.1.0에서 업데이트된 열만 깊은 복사하도록 개선되었습니다.

  • 아래 df 연산에서는 열 ab만 깊은 복사됩니다.

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
R의 data.table로 데이터 조작하기

data.table 내부 동작

  • data.table은 열을 제자리에서(in place), 즉 참조로 업데이트합니다.

  • 결과를 변수에 다시 할당할 필요가 없습니다.

  • 값 변경 시 어떤 열도 복사되지 않습니다.

  • data.table은 새 연산자 :=를 사용하여 열을 참조로 추가/업데이트/삭제합니다.

R의 data.table로 데이터 조작하기

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]
R의 data.table로 데이터 조작하기

함수형 형식

batrips[, `:=`(is_dur_gt_1hour = NULL,                  
               start_station = toupper(start_station))] 
R의 data.table로 데이터 조작하기

연습해 봅시다!

R의 data.table로 데이터 조작하기

Preparing Video For Download...