web-dev-qa-db-ja.com

データフレームを分割する方法

データフレームをいくつかの小さなフレームに分割します。これは非常に些細な質問のように見えますが、ウェブ検索から解決策を見つけることができません。

66
Leo5188

また、データフレームを任意の数の小さなデータフレームにカットすることもできます。ここでは、2つのデータフレームに分割します。

x = data.frame(num = 1:26, let = letters, LET = LETTERS)
set.seed(10)
split(x, sample(rep(1:2, 13)))

与える

$`1`
   num let LET
3    3   c   C
6    6   f   F
10  10   j   J
12  12   l   L
14  14   n   N
15  15   o   O
17  17   q   Q
18  18   r   R
20  20   t   T
21  21   u   U
22  22   v   V
23  23   w   W
26  26   z   Z

$`2`
   num let LET
1    1   a   A
2    2   b   B
4    4   d   D
5    5   e   E
7    7   g   G
8    8   h   H
9    9   i   I
11  11   k   K
13  13   m   M
16  16   p   P
19  19   s   S
24  24   x   X
25  25   y   Y

既存の列に基づいてデータフレームを分割することもできます。たとえば、cylmtcars列に基づいて3つのデータフレームを作成するには:

split(mtcars,mtcars$cyl)
56
Greg

いくつかの変数の値に従ってデータフレームを分割する場合は、plyrパッケージのdaply()を使用することをお勧めします。

library(plyr)
x <- daply(df, .(splitting_variable), function(x)return(x))

現在、xはデータフレームの配列です。データフレームの1つにアクセスするために、分割変数のレベルの名前でインデックスを付けることができます。

x$Level1
#or
x[["Level1"]]

ただし、データを多くのデータフレームに分割する前に、データを処理する他の賢い方法はないと確信しています。

19
JoFrhwld

また使用することができます

data2 <- data[data$sum_points == 2500, ]

これにより、sum_points = 2500の値を持つデータフレームが作成されます

それは与えます :

airfoils sum_points field_points   init_t contour_t   field_t
...
491        5       2500         5625 0.000086  0.004272  6.321774
498        5       2500         5625 0.000087  0.004507  6.325083
504        5       2500         5625 0.000088  0.004370  6.336034
603        5        250        10000 0.000072  0.000525  1.111278
577        5        250        10000 0.000104  0.000559  1.111431
587        5        250        10000 0.000072  0.000528  1.111524
606        5        250        10000 0.000079  0.000538  1.111685
....
> data2 <- data[data$sum_points == 2500, ]
> data2
airfoils sum_points field_points   init_t contour_t   field_t
108        5       2500          625 0.000082  0.004329  0.733109
106        5       2500          625 0.000102  0.004564  0.733243
117        5       2500          625 0.000087  0.004321  0.733274
112        5       2500          625 0.000081  0.004428  0.733587
13

私はあなたを助けるかもしれない一種のRFCを投稿しました: Rのチャンクにベクトルを分割する

x = data.frame(num = 1:26, let = letters, LET = LETTERS)
## number of chunks
n <- 2
dfchunk <- split(x, factor(sort(rank(row.names(x))%%n)))
dfchunk
$`0`
   num let LET
1    1   a   A
2    2   b   B
3    3   c   C
4    4   d   D
5    5   e   E
6    6   f   F
7    7   g   G
8    8   h   H
9    9   i   I
10  10   j   J
11  11   k   K
12  12   l   L
13  13   m   M

$`1`
   num let LET
14  14   n   N
15  15   o   O
16  16   p   P
17  17   q   Q
18  18   r   R
19  19   s   S
20  20   t   T
21  21   u   U
22  22   v   V
23  23   w   W
24  24   x   X
25  25   y   Y
26  26   z   Z

乾杯、セバスチャン

11
Sebastian

subset()も便利です:

subset(DATAFRAME, COLUMNNAME == "")

調査パッケージの場合、おそらくsurveyパッケージが適切ですか?

http://faculty.washington.edu/tlumley/survey/

7
apeescape

必要な答えは、データフレームを分割する方法と理由に大きく依存します。

たとえば、いくつかの変数を除外する場合、データベースの特定の列から新しいデータフレームを作成できます。データフレームの後の括弧内の添え字は、行番号と列番号を示します。完全な説明については、詩をご覧ください。

newdf <- mydf[,1:3]

または、特定の行を選択できます。

newdf <- mydf[1:3,]

また、これらの添え字は、特定の値を含む行の選択や、目的の値を持つ要因の選択などの論理テストにすることもできます。

残ったチャンクで何をしたいですか?データベースの各チャンクで同じ操作を実行する必要がありますか?次に、データフレームのサブセットがリストなどの便利なオブジェクトになり、データフレームの各チャンクで同じコマンドを実行するのに役立ちます。

4
Ben M

いずれかの列の値で分割する場合は、lapplyを使用できます。たとえば、ChickWeightをひよこごとに個別のデータセットに分割するには:

data(ChickWeight)
lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,])
3
mikeck

データフレームの分割は逆効果のようです。代わりに、split-apply-combineパラダイムを使用します。たとえば、データを生成します。

df = data.frame(grp=sample(letters, 100, TRUE), x=rnorm(100))

次に、関連する列のみを分割し、scale()関数を各グループのxに適用し、結果を結合します(split<-またはaveを使用)

df$z = 0
split(df$z, df$grp) = lapply(split(df$x, df$grp), scale)
## alternative: df$z = ave(df$x, df$grp, FUN=scale)

これは、data.framesの分割と比較して非常に高速であり、結果は反復なしでダウンストリーム解析で使用可能なままです。 dplyrの構文は

library(dplyr)
df %>% group_by(grp) %>% mutate(z=scale(x))

一般に、このdplyrソリューションはデータフレームの分割より高速ですが、split-apply-combineほど高速ではありません。

3
Martin Morgan