究極の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()
やその他のインデックス作成のヒントなど、より多くの情報とヒントがあります。