궁극적 인 R data.table 치트 시트

속도. 간결한 구문. 이전 버전과의 호환성.

그러나 특히 속도.

이것들은 R의 data.table을 팬들에게 매력적으로 만드는 몇 가지 기능입니다.

그리고 내가 그렇듯이 깔끔한 사용자라고하더라도 data.table은 R 툴킷에 유용한 추가 기능이 될 수 있습니다. 특히 대용량 데이터 세트, Shiny 앱 또는 패키지 함수에서 작업 할 때 유용합니다. 

이 R data.table 궁극적 인 치트 시트는 대화 형 이기 때문에 다른 많은 것과 다릅니다 . 열 추가 와 같은 특정 구문을 검색 하거나 하위 집합 또는 모양 변경 과 같은 작업 그룹 유형으로 검색 할 수 있습니다 . 이 치트 시트 tidyverse "번역"코드가 포함되어 있기 때문에 또한, 당신은 또한 같은 동사 좋아하는 dplyr를 검색 할 수 있습니다 개의 mutate 또는 rowwise .

등록 된 사용자는 자신의 시스템에서 사용하기 위해이 대화식 테이블의 확장 된 버전을 다운로드 할 수 있습니다! 등록은 무료입니다. 

data.table 및 깔끔한 작업 및 코드 검색

직무 유형 data.table 코드 Tidyverse 코드
CSV 파일에서 읽기 수입 mydt <-fread ( "myfile.csv") myt <-read_csv ( "myfile.csv") # 또는 myt <-vroom :: vroom ( "myfile.csv")
CSV 파일의 처음 x 개 행 가져 오기 수입 mydt_x <-fread ( "myfile.csv", nrows = x) myt_x <-read_csv ( "myfile.csv", n_max = x)
특정 패턴과 일치하는 CSV 파일에서 해당 행만 가져옵니다. 수입 mydt_pattern <-fread ( "grep 'mypattern'myfile.csv") myt_pattern <-vroom :: vroom (pipe ( "grep 'mypattern'myfile.csv"))
.gz 압축 파일 가져 오기 수입 mydt <-fread ( "myfile.gz") myt <-vroom :: vroom ( "myfile.gz")
a.zip 압축 파일 가져 오기 수입 mydt <-fread (cmd = 'unzip -cq myfile.zip') myt <-read_csv ( "myfile.zip")
기존 데이터 프레임에서 데이터 테이블 생성 (tidyverse 용 Tibble) 수입 mydt <-as.data.table (mydf) # 또는

setDT (mydf)

myt <-as_tibble (mydf)
복사본을 만들지 않고 제자리에서 data.table 변경 논쟁 setkey (mydt, mycol)와 같이 set로 시작하거나 대괄호 안에 : = 연산자를 사용하는 모든 함수 적용 할 수 없음
여러 열 값을 기준으로 행 정렬 논쟁 mydt2 <-mydt [order (colA, -colB)] #OR

setorder (mydt, colA, -colB)

myt <-배열 (myt, colA, -colB)
열 이름 변경 논쟁 setnames (mydt, old = c ( 'colA', 'colB'), new = c ( 'NewColA', 'NewColB')) myt <-rename (myt, NewColA = colA, NewColB = colB)
열 순서 변경 : 일부 열을 맨 앞 (가장 왼쪽) 위치로 이동 논쟁 setcolorder (mydt, c ( "colB", "colC")) # 이제 위치 1에 colB, 위치 2에 colC myt <-재배치 (myt, colB, colC)
행 번호 n에 대한 행 필터링 부분 집합 mydt2 <-mydt [n] myt2 <-슬라이스 (myt, n)
마지막 행 필터링 부분 집합 mydt2 <-mydt [.N] myt2 <-슬라이스 (myt, n ())
조건으로 행 필터링 부분 집합 # 어떤 경우에는 setkey (mydt, colA, colB)가 colA와 colB에 대한 논리적 테스트의 성능을 # 가속화합니다. 다른 열과 동일

mydt2 <-mydt [논리식]

myt2 <-filter (myt, 논리식)
colA가 string1 또는 string2와 같은 행 필터링 부분 집합 mydt2 <-mydt [colA % chin % c ( "string1", "string2")] myt2 <-filter (myt, colA % in % c ( "string1", "string2"))
colA가 정규식과 일치하는 행 필터링 부분 집합 mydt2 <-mydt [colA % like % "mypattern"] myt2 <-filter (myt, stringr :: str_detect (colA, "mypattern"))
colA 값이 두 숫자 사이 인 행 필터링 부분 집합 mydt2 <-mydt [colA % between % c (n1, n2)] myt2 <-필터 (myt, between (colA, n1, n2))
그룹별로 처음 n 개 행 필터링 부분 집합 mydt2 <-mydt [, .SD [1 : n], by = groupcol] myt2 % group_by (groupcol) %> % 슬라이스 (1 : n)
그룹 별 최대 값에 대한 행 필터링 부분 집합 mydt2 <-mydt [, .SD [which.max (valcol)], 기준 = groupcol] myt2 % group_by (groupcol) %> % filter (valcol == max (valcol))
열을 선택하고 결과를 벡터로 반환 부분 집합 myvec <-mydt [, colname] myvec <-pull (myt, colname)
여러 열을 선택하여 새 data.table (데이터 프레임 또는 tidyverse의 경우 tibble)을 만듭니다. 부분 집합 mydt2 <-mydt [, list (colA, colB)] #OR

mydt2 <-mydt [,. (colA, colB)] #OR

mydt2 <-mydt [, c ( "colA", "colB")]

myt2 <-select (myt, colA, colB)
열 이름이 포함 된 변수를 사용하여 여러 열 선택 부분 집합 my_col_names <-c ( "colA", "colB")

mydt2 <-mydt [, ..my_col_names] # 또는

mydt2 <-mydt [, my_col_names, with = FALSE]

my_col_names <-c ( "colA", "colB")

myt2 <-select (myt, all_of (my_col_names))

여러 열을 선택하고 일부 이름을 바꿉니다. 부분 집합 mydt2 <-mydt [,. (newname1 = col1, newname2 = col2, col3)] myt2 <-select (myt, newname1 = col1, newname2 = col2, col3)
여러 열 제외 부분 집합 mydt2 <-mydt [, -c ( "colA", "colB")] #OR

mydt2 <-mydt [,! c ( "colA", "colB")] #OR

my_col_names <-c ( "colA", "colB")

mydt2 <-mydt [,! .. my_col_names]

myt2 <-select (myt, -c (colA, colB)) #OR

my_col_names <-c ( "colA", "colB")

myt2 <-select (myt,-{{my_col_names}})

여러 열의 값을 기반으로 중복 행 제거 부분 집합 mydt2 <-unique (mydt, by = c ( "colA", "colB")) myt2 <-distinct (myt, colA, colB, .keep_all = TRUE)
여러 열을 기반으로 고유 행 계산 요약하다 uniqueN (mydt, 기준 = c ( "colA", "colB")) nrow (distinct (myt, colA, colB))
데이터에 대한 요약 계산 실행 요약하다 mydt2 <-mydt [, myfun (colA ...)] myt2 % summarise (ColName = myfun (colA ...))
한 그룹의 데이터에 대한 요약 계산 실행 요약하다 mydt2 <-mydt [, myfun (colA ...), by = groupcol] myt2 %

group_by (groupcol) %> %

요약하다(

NewCol = myfun (colA ...)

)

한 그룹별로 데이터에 대한 요약 계산을 실행하고 새 열의 이름을 지정합니다. 요약하다 mydt2 <-mydt [,. (MyNewCol = myfun (colA ...)), 기준 = groupcol] myt2 %

group_by (groupcol) %> %

요약하다(

NewCol = myfun (colA ...)

)

여러 그룹의 데이터에 대한 요약 계산 실행 요약하다 mydt2 <-mydt [, myfun (colA ...), 기준 =. (groupcol1, groupcol2)] myt2 %

group_by (groupcol1, groupcol2) %> %

요약하다(

NewCol = myfun (colA ...)

)

여러 그룹별로 필터링 된 데이터에 대한 요약 계산 실행 요약하다 mydt2 <-mydt [필터 표현식, myfun (colA), 기준 =. (groupcol1, groupcol2)] myt2 %

필터 (필터 표현식) %> %

group_by (groupcol1, groupcol2) %> %

요약하다(

NewCol = myfun (colA), .groups = "keep"

)

그룹별로 행 수 계산 요약하다 mydt2 <-mydt [,. N, by = groupcol] # 한 그룹에 대해 #OR

mydt2 <-mydt [, .N, 기준 =. (groupcol1, groupcol2)]

myt2 <-count (myt, groupcol) # 한 그룹에 대해 #OR

myt2 <-개수 (myt, groupcol1, groupcol2)

여러 열을 요약하고 결과를 여러 열로 반환 요약하다 mydt2 <-mydt [, lapply (.SD, myfun),

.SDcols = c ( "colA", "colB")]

myt2 %

요약하다(

전체 (c (colA, colB), myfun)

)

그룹별로 여러 열을 요약하고 결과를 여러 열로 반환 요약하다 mydt2 <-mydt [, lapply (.SD, myfun),

.SDcols = c ( "colA", "colB"), 기준 = groupcol]

myt2 %

group_by (groupcol) %> %

summarise (across (c (colA, colB), myfun))

열 추가 계산하다 mydt [, MyNewCol : = myfun (colA)] myt %

mutate (

MyNewCol = myfun (colA)

)

한 번에 여러 열 추가 계산하다 # 함수 나 표현을 사용

mydt [,`: =`(NewCol1 = myfun (colA), NewCol2 = colB + colC)] #OR

mydt [, c ( "NewCol1", "newCol2") : = list (myfun (colA), colB + colC)]

myt %

mutate (

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

날짜 값과 이전 날짜 값의 차이 찾기와 같이 다른 열의 현재 값과 이전 값을 사용하여 열을 추가합니다. 계산하다 mydt [, Diff : = colA-shift (colA)] myt <-mutate (myt, Diff = colA-lag (colA))
그룹별로 열의 이전 값을 참조하는 열 추가 계산하다 mydt2 <-mydt [, Diff : = colA-shift (colA), by = groupcol] myt2 % group_by (groupcol) %> % mutate (Diff = colA-lag (colA))
그룹별로 행 ID 번호가있는 열 추가 계산하다 mydt [, myid : = 1 : .N, by = groupcol] myt % group_by (groupcol) %> % mutate (myid = row_number ())
여러 if else 문을 사용하지 않고 여러 조건을 기반으로 열 추가 (예 : SQL의 CASE) 계산하다 # data.table 버전 1.13 이상 필요

# 새 줄의 각 조건이 마음에 들지만 필수 사항은 아닙니다.

mydt2 <-mydt [, NewCol : = fcase (

조건 1, "값 1",

condition2, "Value2",

condition3, "Value3",

default = "Other"# 다른 모든 값

)]

myt2 %

mutate (

NewCol = case_when (

condition1 ~ "Value1",

condition2 ~ "Value2",

condition3 ~ "Value3",

TRUE ~ "기타"

)

)

행별 연산을 통해 열 추가 계산하다 mydt [, newcol : = myfun (colB, colC, colD), 기준 = 1 : nrow (mydt)]

# 또는 colA에 모든 고유 값이있는 경우

mydt [, newcol : = myfun (colB, colC, colD), 기준 = colA]

myt %

rowwise () %> %

mutate (

newcol = myfun (colB, colC, colD)

)

# 또는

myt %

rowwise () %> %

mutate (

#use dplyr select 구문 :

newcol = myfun (c_across (colB : colD))

)

둘 이상의 열로 두 데이터 세트를 결합합니다. 모두 set1에 유지하지만 set2에만 일치 어울리다 mydt <-dt2 [dt1, on = c ( "dt2col"= "dt1col")] #OR

mydt <-merge (dt1, dt2, by.x = "dt1col", by.y = "dt2col", all.x = TRUE) #OR

setkey (dt1, "dt1col") setkey (dt2, "dt2col") mydt <-dt2 [dt1]

myt <-left_join (df1, df2, 기준 = c ( "df1col"= "df2col"))
둘 이상의 열로 2 개의 데이터 세트 결합-모두 세트 1에 유지하지만 세트 2에서만 일치 어울리다 mydt <-merge (dt1, dt2, by.x = c ( "dt1colA", "dt1colB"), by.y = c ( "dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) # 또는

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <-dt2 [dt1]

myt <-left_join (df1, df2, 기준 = c ( "df1colA"= "df2colA", "df1colB"= "df2colB"))
하나의 공통 열로 두 데이터 세트를 결합하십시오. 성냥 만 유지 어울리다 mydt <-merge (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2") myt <-inner_join (df1, df2, by = c ( "df1col"= "df2col"))
하나의 공통 열로 두 데이터 세트를 결합하고 일치 항목이 있는지 여부에 관계없이 두 세트의 모든 데이터를 유지합니다. 어울리다 mydt <-merge (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", 모두 = TRUE) myt <-full_join (df1, df2, 기준 = c ( "df1col"= "df2col"))
한 행에서 다른 행 아래로 행을 추가하여 두 데이터 세트 결합 어울리다 mydt_joined <-rbindlist (list (mydt, mydt2)) myt_joined <-bind_rows (myt, myt2)
데이터의 폭을 넓게 변경 모양 변경 mydt_long <-melt (mydt, measure.vars = c ( "col1", "col2", "col3"), variable.name = "NewCategoryColName", value.name = "NewValueColName") myt_long <-pivot_longer (myt, cols = starts_with ( "col"), names_to = "NewCategoryColName", values_to = "NewValueColName")
데이터를 길거나 넓게 재구성 모양 변경 mydt_wide <-dcast (mydt, id_col1 ~ col1, value.var = "ValueColName") myt_wide <-pivot_wider (myt, names_from = col1, values_from = ValueColName)
여러 표현식 연결 논쟁 mydt [expr1] [expr2] myt %

expr1 %> %

expr2

CSV 파일로 데이터 내보내기 수출 fwrite (mydt, "myfile.csv") write_csv (myt, "myfile.csv")
기존 CSV 파일에 행 추가 수출 fwrite (mydt2, "myfile.csv", 추가 = TRUE) vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE)
압축 된 CSV 파일로 데이터 내보내기 수출 fwrite (mydt, "myfile.csv.gz", compress = "gzip") vroom :: vroom_write (myt, "myfile2.csv.gz")

data.table에 대해 배울 것이 더 많이 있습니다! data.table 기본 사항에 대해서는 5 분짜리 소개 비디오를 확인하십시오.

마지막으로 data.table 웹 사이트에는 사용 setkey()및 기타 색인 작성 팁과 같은 더 많은 정보와 팁이 있습니다.