2

ID、feat1、feat2、feat3、ブール値を持つ特徴ベクトル (data.frame) を作成しましたが、このデータ フレームには ID の重複があり、これは意図的に行われています。私がやりたいことは、このデータ フレームを反復処理して、ID ごとに新しいデータ フレームを作成することです。

簡単にするために、次の 2 つの列があると仮定します。

          X1         X2      X3
1   000000001 -1.4061361     1
2   000000001 -0.1973846     1
3   000000002 -0.4385071     1
4   000000001 -0.6593677     0
5   000000001 -1.2592415     0
6   000000001 -0.5463655     1
7   000000002  0.4231117     0
8   000000002 -0.1640883     1
9   000000002  0.7157506     0
10  000000002  2.3234110     1

X1に基づいて別のデータフレームを構築したい 基本的に、同じX1をすべて独自のデータフレームに入れたいです。複数の for ループを使って書いたのですが、データセットが大きいのでとても時間がかかります。これを行う最善の方法は何ですか?

4

3 に答える 3

3

コメントで提案されているように、を使用しますsplit。本当に新しいオブジェクトを作成したい場合は、次のようsplitに組み合わせて使用​​しlist2envます。

## What is in the workspace presently?
ls()
# [1] "mydf"

## This is where most R users would probably stop
split(mydf, mydf$X1)
# $`1`
#   X1         X2 X3
# 1  1 -1.4061361  1
# 2  1 -0.1973846  1
# 4  1 -0.6593677  0
# 5  1 -1.2592415  0
# 6  1 -0.5463655  1
# 
# $`2`
#    X1         X2 X3
# 3   2 -0.4385071  1
# 7   2  0.4231117  0
# 8   2 -0.1640883  1
# 9   2  0.7157506  0
# 10  2  2.3234110  1

上記のコマンドは を作成しますlist。これは、各リスト項目で同様の計算を行う場合に非常に便利な形式です。ほとんどの R ユーザーはそこで止まるでしょう。ワークスペースで個別のオブジェクトが本当に必要な場合は、次を使用しますlist2env

list2env(split(mydf, mydf$X1), envir=.GlobalEnv)
# <environment: R_GlobalEnv>

## How many objects do we have now?
ls()
# [1] "1"    "2"    "mydf"

これらの名前は構文的に有効ではないため、バックティックを使用する必要があることに注意してください (</code>) to access them. (Or, alternatively,get("1")`).

`1`
#   X1         X2 X3
# 1  1 -1.4061361  1
# 2  1 -0.1973846  1
# 4  1 -0.6593677  0
# 5  1 -1.2592415  0
# 6  1 -0.5463655  1
`2`
#    X1         X2 X3
# 3   2 -0.4385071  1
# 7   2  0.4231117  0
# 8   2 -0.1640883  1
# 9   2  0.7157506  0
# 10  2  2.3234110  1
于 2013-09-06T02:22:36.400 に答える
1

これは for ループを 1 つ使用します。

ids <- unique(df$X1)

for(i in 1:length(ids)){
    id <- ids[i]
    mini.df <- data.frame(df[df$X1 == id, ])
    assign(paste("mini.df", i, sep="."), mini.df)
    # or alternatively, if you wanted the data.frames to be assigned by id, 
    # assign(id, mini.df)
}
于 2013-09-06T00:35:10.637 に答える