11

以下のようなデータ フレームがあります (20,000 行 x 49 列)。各行には一意の名前 (ID) があり、各 ID には 3 つの列に 3 つの繰り返し読み取りがあります (例: D15C D15C.1 D15C.2)。colnames の最初の 4 文字 ("D15C") はグループ名です。グループ名で列を平均する必要があります (たとえば、D15C を取得するには、D15C、D15C.1、および D15.2 の平均)。そのため、最終的なテーブルは 49 列から 16 列に統合されます。

          ID  D04C D04C.1  D08H D08H.1 D08H.2  D15C D15C.1 D15C.2  D15L D15L.1 D15L.2
1 1367452_at 11.11  10.93 11.85  10.94  10.87 10.73  10.62  10.85 10.73  10.77  10.52   
2 1367453_at  9.65   9.94  9.78   9.68   9.67  9.86   9.71   9.82  9.74   9.71   9.76   
3 1367454_at 10.19  10.36  9.68  10.07  10.08 10.35  10.26  10.32 10.27  10.19  10.47   
(… 20000 rows)                                              

集計を使用するために、次のデータ フレームに転置して編集しました。

      ID 1367452_at 1367453_at 1367454_at ... ...
1   D04C      11.11       9.65      10.19
2   D04C      10.93       9.94      10.36
3   D08H      11.85       9.78       9.68
4   D08H      10.94       9.68      10.07
5   D08H      10.87       9.67      10.08
6   D15C      10.73       9.86      10.35
7   D15C      10.62       9.71      10.26
8   D15C      10.85       9.82      10.32
9   D15L      10.73       9.74      10.27
10  D15L      10.77       9.71      10.19
11  D15L      10.52       9.76      10.47

ただし、次の集計 (「agg」はデータ フレーム名) は、完了するまでに 370 秒かかりました。問題は、この種のテーブルが何百も待機していることです......

agg <- aggregate(x = agg[, 2:ncol(agg)], by = list(ID = agg$ID), FUN = "mean", na.rm = T)

そこで、それを data.table に変換し、データ テーブル メソッドを実行しました。

dt <- as.data.table(agg)
setkey(dt, ID)
dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID]

しかし、数分後にエラーメッセージが表示されました:

Error: cannot allocate vector of size 144 Kb
In addition: Warning messages:
1: Reached total allocation of 1535Mb: see help(memory.size) 
2: Reached total allocation of 1535Mb: see help(memory.size)

何が悪いのかわからない。dt[1:5,1:5] を使用して dt の「頭」部分を確認することはできません。また、head(dt) が屋根を通り抜ける行が多すぎて、「頭」も見えません。今何をすべきかわからない。

ID を 1 つの列にリストする (data.frame のように) か、テーブルを転置して最初の行に ID をリストする (data.table のように) ことができます。いずれにせよ、データを集計するためのより高速な方法はありますか? 非常に高く評価!

4

1 に答える 1

12

これ :

dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID]

ただである必要があります:

dt2 <- dt[, lapply(.SD,mean), by=ID]

実際には、行のdt[2:ncol(dt)]サブセットを取得していました。

data.table構文を学ぶ簡単な方法の1つは、プロンプトで実行example(data.table)し、プロンプトで例を実行することです。「#グループごとに列を適用する」を検索すると、まさにこの例が見つかります。

そして、学ぶため.SDの最良の方法は?data.table、文字列を検索することです。次に、検索「[data.table] .SD」によって返される、このdata.tableタグ".SD"に関するいくつかの良い質問と非常に詳細な回答があります。.SD

于 2012-06-14T15:17:13.003 に答える