R Language
분할 기능
수색…
스플릿의 기본 사용법
split
은 요소 또는 그룹 변수와 관련하여 벡터 또는 data.frame을 버킷으로 나눌 수 있습니다. 이 버킷으로 환기는 (그룹 와이즈 연산을 적용하기 위해 사용될 수있는리스트의 형태로 얻어 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
같은 길이 우리의 벡터가 testdata
. 이제이 테스트 데이터를 vowels
과 consonants
의 두 그룹으로 split
수 있습니다.
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
에서 오는 이름 목록입니다.
split
에는 data.frames를 처리하는 메소드도 있습니다.
예를 들어 iris
데이터를 고려해보십시오.
data(iris)
split
을 사용하여, 홍채 종류별로 하나의 data.frame을 포함하는 목록을 만들 수 있습니다 (변수 : 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
(setosa 그룹에 대한 데이터 만 포함).
하나의 예시적인 동작은 홍채 종별 상관 매트릭스를 계산하는 것이다. 그러면 lapply
를 사용할 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
한 번의 계산이 그러한 그룹 단위의 레벨에서 수행된다는 것에주의하십시오. 하나는 결과를 스태킹하는 데 관심이있을 수 있습니다.
> (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)으로 두 대의 자동차를 얻고 자하는 데이터 분석을 고려해 봅시다. 먼저 mtcars
데이터 프레임을 실린더 수로 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
# ...
이것은 각 실린더 수에 대해 하나씩 데이터 프레임 목록을 반환했습니다. 출력에 표시된 것처럼 우리는 spl$`4`
, spl$`6`
및 spl$`8`
관련 데이터 프레임을 얻을 수 있습니다 (일부는 spl$"4"
또는 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, 함수)의 결과를 리턴합니다.
이 같은 간단한 분석을 사용하면 전체 코드 분할 적용 결합을 코드의 단일 행에서 수행하는 것이 더 간단 할 수 있습니다.
do.call(rbind, lapply(split(mtcars, mtcars$cyl), function(x) tail(x[order(x$mpg),], 2)))
lapply(split(x,f), FUN)
조합은 ?by
함수를 사용하여 대안 적으로 액자화할 수 있다는 lapply(split(x,f), FUN)
주목할 가치가 있습니다.
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)))