データ フレームをいくつかの小さなフレームに分割したいと考えています。これは非常に些細な質問のように見えますが、Web 検索から解決策を見つけることができません。
8 に答える
データ フレームを任意の数の小さなデータ フレームに分割することもできます。ここでは、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
既存の列に基づいてデータ フレームを分割することもできます。たとえば、 のcyl
列に基づいて 3 つのデータ フレームを作成するには、次のようにしmtcars
ます。
split(mtcars,mtcars$cyl)
変数の値に応じてデータフレームを分割する場合は、パッケージdaply()
から使用することをお勧めします。plyr
library(plyr)
x <- daply(df, .(splitting_variable), function(x)return(x))
現在、x
データフレームの配列です。データフレームの 1 つにアクセスするには、分割変数のレベルの名前でインデックスを付けることができます。
x$Level1
#or
x[["Level1"]]
ただし、データを多くのデータフレームに分割する前に、データを処理するより賢い方法は他にないと確信しています。
あなたも使うことができます
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
私はあなたを助けるかもしれない一種の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
乾杯、セバスチャン
subset()
も役に立ちます:
subset(DATAFRAME, COLUMNNAME == "")
調査パッケージの場合、survey
パッケージは適切でしょうか?
必要な答えは、データ フレームを分割する方法と理由によって大きく異なります。
たとえば、一部の変数を省略したい場合は、データベースの特定の列から新しいデータ フレームを作成できます。データ フレームの後の括弧内の添え字は、行番号と列番号を示します。完全な説明については、Spotry を参照してください。
newdf <- mydf[,1:3]
または、特定の行を選択できます。
newdf <- mydf[1:3,]
また、これらの添え字は、特定の値を含む行の選択や、目的の値を持つ要素の選択など、論理テストにもなります。
残ったチャンクで何をしたいですか?データベースの各チャンクで同じ操作を実行する必要がありますか? 次に、データ フレームのサブセットが、データ フレームの各チャンクに対して同じコマンドを実行するのに役立つ便利なオブジェクト (リストなど) になるようにする必要があります。
いずれかの列の値で分割する場合は、 を使用できますlapply
。たとえば、ChickWeight
ひよこごとに個別のデータセットに分割するには、次のようにします。
data(ChickWeight)
lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,])
データ フレームの分割は逆効果のようです。代わりに、分割-適用-結合パラダイムを使用します。たとえば、データを生成します。
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 ソリューションは、データ フレームの分割よりも高速ですが、分割-適用-結合ほど高速ではありません。