수색…


스플릿의 기본 사용법

split 은 요소 또는 그룹 변수와 관련하여 벡터 또는 data.frame을 버킷으로 나눌 수 있습니다. 이 버킷으로 환기는 (그룹 와이즈 연산을 적용하기 위해 사용될 수있는리스트의 형태로 얻어 for 루프 또는 lapply / sapply ).

첫 번째 예는 벡터에 split 을 사용하는 방법을 보여줍니다.

다음과 같은 문자의 벡터를 고려하십시오.

testdata <- c("e", "o", "r", "g", "a", "y", "w", "q", "i", "s", "b", "v", "x", "h", "u")

목표는 그 편지를 voyelsconsonants 으로 분리하는 것입니다. 즉, 편지 유형에 맞게 분할하십시오.

먼저 그룹핑 벡터를 만듭니다.

 vowels <- c('a','e','i','o','u','y')
 letter_type <- ifelse(testdata %in% vowels, "vowels", "consonants") 

참고 letter_type 같은 길이 우리의 벡터가 testdata . 이제이 테스트 데이터를 vowelsconsonants 의 두 그룹으로 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)))


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow