R Language
分割機能
サーチ…
スプリットの基本的な使い方
split
は、ファクタ/グループ変数に関して、ベクトルまたはdata.frameをバケットにsplit
することを可能にします。バケットにこの換気は、次いで、(グループごとの計算を適用するために使用することができるリストの形態、とるfor
ループまたはlapply
/ sapply
)。
最初の例は、ベクトル上のsplit
の使い方を示しています。
文字のベクトルを次のように考えてください。
testdata <- c("e", "o", "r", "g", "a", "y", "w", "q", "i", "s", "b", "v", "x", "h", "u")
目的は、これらの文字をvoyels
とconsonants
に分離することです。つまり、それを文字タイプに分割します。
最初にグループ化ベクトルを作成しましょう:
vowels <- c('a','e','i','o','u','y')
letter_type <- ifelse(testdata %in% vowels, "vowels", "consonants")
letter_type
はvector testdata
と同じ長さであることに注意してください。今度は、このテストデータをvowels
とconsonants
2つのグループにsplit
ことができconsonants
。
split(testdata, letter_type)
#$consonants
#[1] "r" "g" "w" "q" "s" "b" "v" "x" "h"
#$vowels
#[1] "e" "o" "a" "y" "i" "u"
したがって、結果は、名前がグループ化ベクトル/因子letter_type
から来るリストletter_type
。
split
はdata.framesを処理するメソッドもあります。
たとえば、 iris
データを考えてみましょう。
data(iris)
split
を使用することで、1つのdata.frame(iris specie)(variable:Species)を含むリストを作成できます。
> liris <- split(iris, iris$Species)
> names(liris)
[1] "setosa" "versicolor" "virginica"
> head(liris$setosa)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
(セットアサグループのデータのみを含む)。
1つの例示的な動作は、虹彩の種類ごとの相関行列を計算することである。 lapply
を使うでしょう:
> (lcor <- lapply(liris, FUN=function(df) cor(df[,1:4])))
$setosa
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 0.7425467 0.2671758 0.2780984
Sepal.Width 0.7425467 1.0000000 0.1777000 0.2327520
Petal.Length 0.2671758 0.1777000 1.0000000 0.3316300
Petal.Width 0.2780984 0.2327520 0.3316300 1.0000000
$versicolor
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 0.5259107 0.7540490 0.5464611
Sepal.Width 0.5259107 1.0000000 0.5605221 0.6639987
Petal.Length 0.7540490 0.5605221 1.0000000 0.7866681
Petal.Width 0.5464611 0.6639987 0.7866681 1.0000000
$virginica
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 0.4572278 0.8642247 0.2811077
Sepal.Width 0.4572278 1.0000000 0.4010446 0.5377280
Petal.Length 0.8642247 0.4010446 1.0000000 0.3221082
Petal.Width 0.2811077 0.5377280 0.3221082 1.0000000
次に、グループごとに相関変数の最良の組を取り出すことができます(相関行列は再構成/溶け、対角はフィルタリングされ、最良のレコードの選択が実行されます)
> library(reshape)
> (topcor <- lapply(lcor, FUN=function(cormat){
correlations <- melt(cormat,variable_name="correlatio);
filtered <- correlations[correlations$X1 != correlations$X2,];
filtered[which.max(filtered$correlation),]
}))
$setosa
X1 X2 correlation
2 Sepal.Width Sepal.Length 0.7425467
$versicolor
X1 X2 correlation
12 Petal.Width Petal.Length 0.7866681
$virginica
X1 X2 correlation
3 Petal.Length Sepal.Length 0.8642247
そのようなグループ単位のレベルで1つの計算が実行されることに注意してください。結果を積み重ねることに興味があります。
> (result <- do.call("rbind", topcor))
X1 X2 correlation
setosa Sepal.Width Sepal.Length 0.7425467
versicolor Petal.Width Petal.Length 0.7866681
virginica Petal.Length Sepal.Length 0.8642247
split-apply-combineパラダイムでのsplitの使用
データ分析の人気の形式は、適用コンバインスプリット 、あなたがグループにデータを分割した、各グループの処理のいくつかの並べ替えを適用し、結果を結合します。
組み込みのmtcarsデータセット内の各シリンダ数(cyl)に対してガロン当たりの最適なマイル数(mpg)で2台の車を取得したい場合のデータ分析を考えてみましょう。まず、 mtcars
データフレームをシリンダ数で分割します。
(spl <- split(mtcars, mtcars$cyl))
# $`4`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
# Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
# Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
# Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# ...
#
# $`6`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
# Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
# ...
#
# $`8`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
# Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
# Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
# Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
# ...
これにより、各シリンダ数に1つのデータフレームのリストが返されました。出力によって示されるように、私たちはと関連するデータフレーム得ることができたspl$`4`
、 spl$`6`
、およびspl$`8`
(一部はそれをより視覚的に使用するために魅力的見つけるかもしれないspl$"4"
またはspl[["4"]]
)。
今度は、 lapply
を使って、リストの各要素から最高2 mpgの値を持つ車を抽出する関数を適用して、このリストをループすることができます:
(best2 <- lapply(spl, function(x) tail(x[order(x$mpg),], 2)))
# $`4`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#
# $`6`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#
# $`8`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
# Pontiac Firebird 19.2 8 400 175 3.08 3.845 17.05 0 0 3 2
最後に、 rbind
を使用してすべてを組み合わせることができます。 rbind(best2[["4"]], best2[["6"]], best2[["8"]])
を呼び出したいが、巨大なリストを持っていれば、これは面倒だろう。その結果、以下を使用します。
do.call(rbind, best2)
# mpg cyl disp hp drat wt qsec vs am gear carb
# 4.Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# 4.Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
# 6.Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# 6.Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
# 8.Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
# 8.Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
これは引数として渡されるbest2
(引数2、リスト)のすべての要素を持つrbind
(引数1、関数)の結果を返します。
このような単純な分析では、split-apply-combine全体を1行のコードで処理するために、よりコンパクトにすることができます。
do.call(rbind, lapply(split(mtcars, mtcars$cyl), function(x) tail(x[order(x$mpg),], 2)))
lapply(split(x,f), FUN)
組み合わせは?by
関数?by
を使って代替フレーム化することもできます:
by(mtcars, mtcars$cyl, function(x) tail(x[order(x$mpg),], 2))
do.call(rbind, by(mtcars, mtcars$cyl, function(x) tail(x[order(x$mpg),], 2)))