究極のRdata.tableチートシート

速度。簡潔な構文。下位互換性。

しかし、特にスピード。

これらは、Rのdata.tableをファンにとって魅力的なものにする機能の一部です。

そして、あなたが(私がそうであるように)確認された整頓されたユーザーであるとしても、data.tableは、特に大きなデータセット、Shinyアプリ、またはパッケージ関数で作業するときに、Rツールキットへの便利な追加になります。 

このRdata.tableの究極のチートシートは、インタラクティブであるため、他の多くのシートとは異なります。列の追加などの特定のフレーズを検索したり、サブセット形状変更などのタスクグループのタイプで検索したりできます。このチートシートがtidyverse「翻訳」のコードが含まれているためまた、あなたはまた、このような動詞のお気に入りdplyrを検索することができるのmutateまたは行方向

登録ユーザーは、このインタラクティブテーブルの拡張バージョンをダウンロードして、自分のシステムで使用できます。登録は無料です。 

data.tableおよびtidyverseタスクとコードを検索します

仕事 タイプ data.tableコード Tidyverseコード
CSVファイルで読み込む インポート mydt <-fread( "myfile.csv") myt <-read_csv( "myfile.csv")#OR 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)#OR

setDT(mydf)

myt <-as_tibble(mydf)
コピーを作成せずにdata.tableを所定の位置に変更する ラングラー setkey(mydt、mycol)などのsetで始まる関数、または角かっこ内で:=演算子を使用する関数 適用できません
複数の列の値に基づいて行を並べ替える ラングラー mydt2 <-mydt [order(colA、-colB)] #OR

setorder(mydt、colA、-colB)

myt <-arrange(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"))#colBが位置1に、colCが位置2になりました myt <-relocate(myt、colB、colC)
行番号nの行をフィルタリングします サブセット mydt2 <-mydt [n] myt2 <-slice(myt、n)
最後の行をフィルタリングします サブセット mydt2 <-mydt [.N] myt2 <-slice(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値が2つの数値の間にある行をフィルタリングする サブセット mydt2 <-mydt [colA%between%c(n1、n2)] myt2 <-filter(myt、between(colA、n1、n2))
グループで最初のn行をフィルタリングする サブセット mydt2 <-mydt [、。SD [1:n]、by = groupcol] myt2%group_by(groupcol)%>%slice(1:n)
グループごとに最大値の行をフィルタリングする サブセット mydt2 <-mydt [、。SD [which.max(valcol)]、by = 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] #OR

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、by = c( "colA"、 "colB")) nrow(distinct(myt、colA、colB))
データに対して要約計算を実行する 要約する mydt2 <-mydt [、myfun(colA ...)] myt2%summarise(ColName = myfun(colA ...))
1つのグループによるデータの要約計算を実行します 要約する mydt2 <-mydt [、myfun(colA ...)、by = groupcol] myt2%

group_by(groupcol)%>%

要約(

NewCol = myfun(colA ...)

1つのグループごとにデータの要約計算を実行し、新しい列に名前を付けます 要約する mydt2 <-mydt [、。(MyNewCol = myfun(colA ...))、by = groupcol] myt2%

group_by(groupcol)%>%

要約(

NewCol = myfun(colA ...)

複数のグループによるデータの要約計算を実行します 要約する mydt2 <-mydt [、myfun(colA ...)、by =。(groupcol1、groupcol2)] myt2%

group_by(groupcol1、groupcol2)%>%

要約(

NewCol = myfun(colA ...)

複数のグループによってフィルタリングされたデータに対して要約計算を実行します 要約する mydt2 <-mydt [フィルター式、myfun(colA)、by =。(groupcol1、groupcol2)] myt2%

filter(フィルター式)%>%

group_by(groupcol1、groupcol2)%>%

要約(

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

グループごとに行数を数える 要約する mydt2 <-mydt [、。N、by = groupcol] #for one group #OR

mydt2 <-mydt [、.N、by =。(groupcol1、groupcol2)]

myt2 <-count(myt、groupcol)#for one group #OR

myt2 <-count(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")、by = 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())
複数のifelseステートメント(SQLのCASEなど)を使用せずに、いくつかの条件に基づいて列を追加します 計算する #data.tableバージョン1.13以降が必要

#改行の各条件が好きですが、必須ではありません

mydt2 <-mydt [、NewCol:= fcase(

condition1、 "Value1"、

condition2、 "Value2"、

condition3、 "Value3"、

default = "Other"#その他すべての値

)]

myt2%

mutate(

NewCol = case_when(

condition1〜 "Value1"、

condition2〜 "Value2"、

condition3〜 "Value3"、

TRUE〜「その他」

行ごとの操作で列を追加 計算する mydt [、newcol:= myfun(colB、colC、colD)、by = 1:nrow(mydt)]

#またはcolAにすべての一意の値がある場合

mydt [、newcol:= myfun(colB、colC、colD)、by = colA]

myt%

rowwise()%>%

mutate(

newcol = myfun(colB、colC、colD)

#または

myt%

rowwise()%>%

mutate(

#use dplyr select構文:

newcol = myfun(c_across(colB:colD))

2つのデータセットを複数の列で結合します。すべてを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、by = c( "df1col" = "df2col"))
2つのデータセットを複数の列で結合します-すべてをset1に保持しますが、一致するのはset2のみです 参加する mydt <-merge(dt1、dt2、by.x = c( "dt1colA"、 "dt1colB")、by.y = c( "dt2colA"、 "dt2colB")、all.x = TRUE、all.y = FALSE )#OR

setkey(dt1、dt1colA、dt1colB)

setkey(dt2、dt2colA、dt2colB)

mydt <-dt2 [dt1]

myt <-left_join(df1、df2、by = c( "df1colA" = "df2colA"、 "df1colB" = "df2colB"))
1つの共通の列で2つのデータセットを結合します。一致するだけ 参加する mydt <-merge(dt1、dt2、by.x = "dtcol1"、by.y = "dtcol2") myt <-inner_join(df1、df2、by = c( "df1col" = "df2col"))
2つのデータセットを1つの共通の列で結合し、一致するかどうかに関係なく、すべてのデータを両方のセットに保持します 参加する mydt <-merge(dt1、dt2、by.x = "dtcol1"、by.y = "dtcol2"、all = TRUE) myt <-full_join(df1、df2、by = c( "df1col" = "df2col"))
1つのデータセットから別のデータセットの下部に行を追加して、2つのデータセットを結合します 参加する 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 = start_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"、append = 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 Webサイトには、使用方法setkey()やその他のインデックス作成のヒントなど、より多くの情報とヒントがあります。