DBILITY

R apply data manipulation ( 데이터 처리 ) 본문

statistics/R

R apply data manipulation ( 데이터 처리 )

DBILITY 2018. 11. 26. 12:47
반응형

앞선 내용들에서 다루었지만, 정리를 해보자.

c() : combine 값을 조합하여 벡터나 리스트에 할당

paste() : 문자열 합치기 concatenation

str() : structure 데이터 구조 표시

class() : 데이터 타입 표시

is.na() : 데이터에 NA가 포함되어 있지는 표시

save() : 데이터 파일 저장

load() : 저장된 데이터 적재

rbind() : 행렬이나 데이터 프레임에 행단위 데이터 추가

cbind() : 행렬이나 데이터프레임에 열 단위 데이터 추가

as.character() : 문자열로 변경

unique() : 중복제거

summary() : 데이터에 대한 요약정보

quantile() : 분위수 

seq() : 일련번호 생성

등등 많다.

 

apply() 계열 함수에는 apply, lapply, sapply, tapply, mapply가 있다.

apply함수는 행렬의 행 또는 열 방향으로 특정 함수를 적용하여, 벡터, 배열, 리스트 중 적합한 것으로 반환한다.

apply(x, margin, function, ...)

margin이 1이면 행, 2이면 열, c(1,2)이면 행열 방향으로 fun위치의 함수를 적용한다.

#행열생성
> x<-matrix(1:9, ncol=3)
> x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
#행집계
> apply(x, 1, sum)
[1] 12 15 18
#열집계
> apply(x, 2, sum)
[1]  6 15 24
#내장된 iris dataset
> head(iris)
  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
#5번 Species가 집계불가한 컬럼이므로 오류
> apply(iris, 1, sum)
Error in FUN(newX[, i], ...) : invalid 'type' (character) of argument
#5번열을 제외
> apply(iris[,-5], 2, sum)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 
> colSums(iris[,-5])
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 
#4,5열을 제외
> apply(iris[,-c(4,5)], 2, sum)
Sepal.Length  Sepal.Width Petal.Length 
       876.5        458.6        563.7 
> colSums(iris[,-5])
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 
> colSums(iris[,-c(4,5)])
Sepal.Length  Sepal.Width Petal.Length 
       876.5        458.6        563.7 
> colSums(iris[,-c(4,5)],na.rm = TRUE)
Sepal.Length  Sepal.Width Petal.Length 
       876.5        458.6        563.7 
> apply(iris[,-5],2,mean)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333
> colMeans(iris[,-5],na.rm = TRUE)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333

행, 열 방향의 합계는 빈번히 사용되므로 rowSums(), colSums() 함수가 있다.

또한 , 행, 열 방향 평균 역시 rowMeans(), colMeans() 함수로 계산할 수 있다.

 

lapply(x, function, ...) 함수는 x인자로 제공된 벡터 또는 리스트를 function으로 제공된 함수를 실행 후 list형태로 리턴한다.

unlist() 함수는 list를 vector로 변환한다.

> result<-lapply(1:3,function(x){x*2})
> str(result)
List of 3
 $ : num 2
 $ : num 4
 $ : num 6
> result[2]
[[1]]
[1] 4

> result[[2]]
[1] 4
> unlist(result)
[1] 2 4 6
> x<-list(a=c(1,2,3),b=c(4,5,6))
> x
$`a`
[1] 1 2 3

$b
[1] 4 5 6

> lapply(x, mean)
$`a`
[1] 2

$b
[1] 5
> unlist(lapply(iris[,-5], mean))
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333 
> colMeans(iris[,-5])
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333

 

데이터 프레임을 처리할 결과를 데이터 프레임으로 받고 싶을 때는

lapply() 함수로 1) list형태로 전환된 결과를 2) unlist로 vector로 전환, 3) matrix로 행열로 변환, 4) as.data.frame으로 data.frame으로 전환한다.

마지막으로 5) names()를 이용해 변수명을 언어와 데이터 프레임 각 열에 이름을 지정한다. 복잡하구먼~

unlist를 사용할 경우 하나의 데이터 형태로 전환된다.

> d<-as.data.frame(matrix(unlist(lapply(iris[,-5], mean)),ncol = 4,byrow = TRUE))
> str(d)
'data.frame':	1 obs. of  4 variables:
 $ V1: num 5.84
 $ V2: num 3.06
 $ V3: num 3.76
 $ V4: num 1.2
> names(d)<-names(iris[,-5])
> d
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.843333    3.057333        3.758    1.199333

데이터 타입이 여러 개일 경우 do.call()을 사용할 수 있으나, 데이터 처리 속도가 느리다고 한다.

do.call() 함수는 글자 그대로 함수를 호출한다.

do.call(what, args, quote = FALSE, envir = parent.frame())

what은 호출할 함수, args는 함수에 입력할 인자

> d<-do.call(cbind,lapply(iris[,-5], mean))
> d
     Sepal.Length Sepal.Width Petal.Length Petal.Width
[1,]     5.843333    3.057333        3.758    1.199333
> class(d)
[1] "matrix"

sapply() 함수는 lapply와 비슷하지만 함수 연산 후 벡터나 행렬을 리턴한다.
옵션 simplify = FALSE일 때 iris 데이터 연산을 하니 list가 리턴된다.

> x<-lapply(iris[,-5],mean)
> str(x)
List of 4
 $ Sepal.Length: num 5.84
 $ Sepal.Width : num 3.06
 $ Petal.Length: num 3.76
 $ Petal.Width : num 1.2
> class(x)
[1] "list"
> y<-sapply(iris[,-5],mean)
> str(y)
 Named num [1:4] 5.84 3.06 3.76 1.2
 - attr(*, "names")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
> class(y)
[1] "numeric"
> y<-sapply(iris[,-5], mean, simplify = FALSE)
> str(y)
List of 4
 $ Sepal.Length: num 5.84
 $ Sepal.Width : num 3.06
 $ Petal.Length: num 3.76
 $ Petal.Width : num 1.2

tapply는 그룹별 처리를 하는 apply함수로 sql의 그룹핑을 떠올려 보자.

SQL에선 1) group by에 그룹핑 칼럼이 주어지고 select 절에 2) 그룹핑 칼럼, 그룹핑 연산의 대상 칼럼과 3) 연산 함수가 주어진다.

tapply( 데이터, 인덱스, 실행 함수) 형식을 사용한다. SQL과 비교하면 1) 인덱스[factor] 2) 데이터 3) 실행 함수가 되겠다.

> head(iris)
  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
> tapply(iris$Sepal.Length,iris$Species,mean)
    setosa versicolor  virginica 
     5.006      5.936      6.588

mapply()는 sapply()와 비슷하지만, 다수의 인자를 함수에 넘긴다는 차이가 있다.
rnorm(n, mean = 0, sd = 1) 함수 정규분포 함수 입력 인자가 3개다. 

mapply를 통해 실행 시 n 위치에 개수, mean 위치에 평균, sd 위치에 표준편차를 입력해야 하므로,

순서대로 인수를 정의하여 아래와 같이 실행할 수 있다.

mapply(rnorm,c(5,10,20),mean(0,10,50),c(1,1,1))
[[1]]
[1] -0.6809382 -0.2595759 -0.3626066  0.8027021  1.4980161

[[2]]
 [1] -1.84621232 -0.56367225  1.40649571  0.05447426 -0.22696349
 [6] -0.74450919  0.95091465  1.51838841  1.04176099  0.16145063

[[3]]
 [1] -0.220563116  0.393639577 -1.815272307  0.254574148
 [5]  2.025482355 -0.194778244 -0.739673131 -0.067560578
 [9]  0.398198331 -0.513620495  1.210268087  1.610950365
[13]  0.294290326  0.666031094 -0.814947951 -1.680429903
[17]  0.684679017 -0.002158293 -0.544223801 -1.782291371

 

반응형
Comments