99

「ユーザー」のアクションを収集する10列のデータフレームがあり、列の1つにID(一意ではなく、ユーザーを識別する)が含まれています(列10)。データ フレームの長さは約 750000 行です。単一のアクターのアクションを分離するために、「ユーザー」識別子を含む列で分割された個々のデータ フレーム (データ フレームのリストまたはベクトルを取得) を抽出しようとしています。

ID | Data1 | Data2 | ... | UserID
1  | aaa   | bbb   | ... | u_001
2  | aab   | bb2   | ... | u_001
3  | aac   | bb3   | ... | u_001
4  | aad   | bb4   | ... | u_002

結果として

list(
ID | Data1 | Data2 | ... | UserID
1  | aaa   | bbb   | ... | u_001
2  | aab   | bb2   | ... | u_001
3  | aac   | bb3   | ... | u_001
,
4  | aad   | bb4   | ... | u_002
...)

以下は、小さなサンプル (1000 行) で非常にうまく機能します。

paths = by(smallsampleMat, smallsampleMat[,"userID"], function(x) x)

次に、たとえば、パス[1]で必要な要素にアクセスします。

元の大きなデータ フレームまたは行列表現に適用すると、これが私のマシン (4 GB RAM、MacOSX 10.6、R 2.15) を詰まらせ、完了しません (新しい R バージョンが存在することは知っていますが、これは主な問題ではないと思います)。

split の方がパフォーマンスが高く、長い間完了しているようですが、結果のベクトルのリストを行列のベクトルに分割する方法がわかりません (劣った R の知識)。

path = split(smallsampleMat, smallsampleMat[,10]) 

etcも使用することを検討big.matrixしましたが、プロセスをスピードアップするほどの成功はありませんでした。

4

3 に答える 3

13

この回答に出くわし、実際には両方のグループが必要でした(その1人のユーザーを含むデータと、その1人のユーザー以外のすべてを含むデータ)。この投稿の詳細には必要ありませんが、誰かが私と同じ問題をグーグルで検索している場合に備えて追加すると思いました.

df <- data.frame(
     ran_data1=rnorm(125),
     ran_data2=rnorm(125),
     g=rep(factor(LETTERS[1:5]), 25)
 )

test_x = split(df,df$g)[['A']]
test_y = split(df,df$g!='A')[['TRUE']]

外観は次のとおりです。

head(test_x)
            x          y g
1   1.1362198  1.2969541 A
6   0.5510307 -0.2512449 A
11  0.0321679  0.2358821 A
16  0.4734277 -1.2889081 A
21 -1.2686151  0.2524744 A

> head(test_y)
            x          y g
2 -2.23477293  1.1514810 B
3 -0.46958938 -1.7434205 C
4  0.07365603  0.1111419 D
5 -1.08758355  0.4727281 E
7  0.28448637 -1.5124336 B
8  1.24117504  0.4928257 C
于 2016-07-28T04:50:20.690 に答える