본문 바로가기
R/Data Operation

R 데이터 분리, 병합, 정렬 - split/subset/merge/sort/order

by 통계열등생 2020. 12. 5.
반응형

 ◎ split

 

> result = split(iris, iris$Species)
> result
$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
...

$versicolor
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
51           7.0         3.2          4.7         1.4 versicolor
52           6.4         3.2          4.5         1.5 versicolor
53           6.9         3.1          4.9         1.5 versicolor
54           5.5         2.3          4.0         1.3 versicolor
55           6.5         2.8          4.6         1.5 versicolor
56           5.7         2.8          4.5         1.3 versicolor
...

$virginica
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
101          6.3         3.3          6.0         2.5 virginica
102          5.8         2.7          5.1         1.9 virginica
103          7.1         3.0          5.9         2.1 virginica
104          6.3         2.9          5.6         1.8 virginica
105          6.5         3.0          5.8         2.2 virginica
106          7.6         3.0          6.6         2.1 virginica
...

split() 함수는 주어진 조건에 따라 데이터를 분리한다. 두번째 인수자리에 분리할 기준이 되는 factor(요인)형 데이터를 기술하면 되고 반환 값은 리스트이다.

R의 내장데이터인 iris 데이터를 Species(종)에 따라 분리한 리스트 결과이다.

 

> summary(result)
           Length Class      Mode
setosa     5      data.frame list
versicolor 5      data.frame list
virginica  5      data.frame list

리스트 결과를 summary() 함수에 넣으면 칼럼의 수, 각각의 키(key) 안에 저장된 자료구조, 자료형을 얻을 수 있다.

 

 

 

 ◎ subset

 

> subset(iris, Species=='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
...

subset() 함수는 주어진 조건을 만족하는 데이터를 선택한다. split() 함수는 전체를 부분으로 구분하지만 subset() 함수는 조건을 만족하는 특정 부분만 반환한다. 두번째 인수자리에 조건식을 입력한다.

 

> subset(iris, Species=='setosa' & Sepal.Length>5.0)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
11          5.4         3.7          1.5         0.2  setosa
15          5.8         4.0          1.2         0.2  setosa
16          5.7         4.4          1.5         0.4  setosa
17          5.4         3.9          1.3         0.4  setosa
...

두가지 이상의 조건을 조합할 때는 &(and)와 |(or)을 사용하면 된다.

 

> result = subset(iris, select=c(Sepal.Length, Species))
> head(result)
  Sepal.Length Species
1          5.1  setosa
2          4.9  setosa
3          4.7  setosa
4          4.6  setosa
5          5.0  setosa
6          5.4  setosa
> str(result)
'data.frame':	150 obs. of  2 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

subset() 함수에서 select 인수를 지정하면 특정 칼럼을 선택 or 제외할 수 있다.

 

 

 

 ◎ merge

merge() 함수는 데이터를 특정 칼럼을 기준으로 4가지 방식의 병합을 할 수 있다. 

by 인수를 사용해 변합 기준으로 사용할 칼럼을 지정할 수 있고, 병합할 두 데이터의 컬럼이름이 다르다면 by.x=" ", by.y=" " 이렇게 칼럼이름을 지정해주면 된다.

all 인수의 기본값은 FALSE로 두 데이터 모두 가지고 있는 공통된 데이터만 병합해 결과로 보여준다. TRUE는 두 데이터가 가지고 있는 모든 행을 병합하고 누락이 생기는 부분을 NA로 채운다. all.x와 all.y를 사용해 특정 데이터를 기준으로 병합할 수도 있다.

 

> df1 = data.frame(name=c('a','b','c','d','e','f'),
+                  age=c(25,27,24,35,28,31))
> df2 = data.frame(name=c('h','d','b','a','e','g'),
+                  gender=c('f','f','m','m','f','m'),
+                  pay=c(200,250,200,300,230,260))
> merge(df1, df2)
  name age gender pay
1    a  25      m 300
2    b  27      m 200
3    d  35      f 250
4    e  28      f 230
> merge(df1, df2, by='name', all=FALSE)
  name age gender pay
1    a  25      m 300
2    b  27      m 200
3    d  35      f 250
4    e  28      f 230

 

> merge(df1, df2, by='name', all.x=TRUE)
  name age gender pay
1    a  25      m 300
2    b  27      m 200
3    c  24   <NA>  NA
4    d  35      f 250
5    e  28      f 230
6    f  31   <NA>  NA
> merge(df1, df2, by='name', all.y=TRUE)
  name age gender pay
1    a  25      m 300
2    b  27      m 200
3    d  35      f 250
4    e  28      f 230
5    g  NA      m 260
6    h  NA      f 200

 

> merge(df1, df2, by='name', all=TRUE)
  name age gender pay
1    a  25      m 300
2    b  27      m 200
3    c  24   <NA>  NA
4    d  35      f 250
5    e  28      f 230
6    f  31   <NA>  NA
7    g  NA      m 260
8    h  NA      f 200
> cbind(df1, df2)
  name age name gender pay
1    a  25    h      f 200
2    b  27    d      f 250
3    c  24    b      m 200
4    d  35    a      m 300
5    e  28    e      f 230
6    f  31    g      m 260

merge() 함수와 cbind() 함수는 다르다. merge() 함수는 칼럼을 기준으로 좀더 정교하게 데이터를 병합할 수 있지만, cbind() 함수는 데이터 길이만 같다면 단순히 이어붙이는 식의 병합만 가능하다.

 

 

 

 ◎ sort

 

> x = c(15,42,35,20,11)
> sort(x)
[1] 11 15 20 35 42
> sort(x, decreasing=TRUE)
[1] 42 35 20 15 11
> x
[1] 15 42 35 20 11

sort() 함수는 주어진 데이터를 직접 정렬해주는 함수이다. 정렬된 결과로 데이터가 변경되지 않으므로 따로 변수에 전달하여 정렬값을 저장해야 한다. 

 

> y = c(15,42,35,20,11,NA)
> sort(y)
[1] 11 15 20 35 42
> sort(y, na.last=TRUE)
[1] 11 15 20 35 42 NA

na.last 인수는 NA 값을 정렬한 결과의 어디에 둘 것인지를 결정한다. TRUE는 NA를 결과의 마지막에 정렬하고, FALSE는 처음으로 정렬한다. na.last를 따로 설정하지 않으면 NA를 정렬결과에서 제외시킨다.

 

 

 

 ◎ order

 

> x = c(15,42,35,20,11)
> order(x)
[1] 5 1 4 3 2
> order(x, decreasing = TRUE)
[1] 2 3 4 1 5

order() 함수는 데이터를 정렬했을 때의 순서를 반환한다. 

 

> iris[order(iris$Sepal.Length),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
14           4.3         3.0          1.1         0.1     setosa
9            4.4         2.9          1.4         0.2     setosa
39           4.4         3.0          1.3         0.2     setosa
43           4.4         3.2          1.3         0.2     setosa
42           4.5         2.3          1.3         0.3     setosa
4            4.6         3.1          1.5         0.2     setosa
7            4.6         3.4          1.4         0.3     setosa
23           4.6         3.6          1.0         0.2     setosa
48           4.6         3.2          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
...

order() 함수가 정렬된 순서를 반환한다는 점을 이용해 데이터를 정렬시킬 수 있다. R의 내장데이터 iris를 첫번째 칼럼인 Sepal.Length에 따라 정렬시킨 결과이다.

 

> iris[order(iris$Sepal.Length, iris$Petal.Length),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
14           4.3         3.0          1.1         0.1     setosa
39           4.4         3.0          1.3         0.2     setosa
43           4.4         3.2          1.3         0.2     setosa
9            4.4         2.9          1.4         0.2     setosa
42           4.5         2.3          1.3         0.3     setosa
23           4.6         3.6          1.0         0.2     setosa
7            4.6         3.4          1.4         0.3     setosa
48           4.6         3.2          1.4         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
...

order() 함수에 두개의 칼럼을 입력하면 먼저 Sepal.Length에 따라 정렬한 뒤 Sepal.Length에서 같은 값들은 Petal.Length에 따라 정렬한 결과를 얻을 수 있다.

 

 

 

 

 

<R 데이터 분리, 병합, 정렬 - split/subset/merge/sort/order>

반응형

댓글