R을 이용한 데이터처리 & 분석실무 책을 참고로 합니다. 정확한 지식은 책을 통해 얻으시길 바랍니다

데이터를 분리하고 병합하는 것은 데이터 분석에 있어서 피할 수 없죠. 데이터 분리에는 split(), subset() 함수가 쓰이고, 데이터 병합에는 merge()가 쓰이며 데이터 정렬에는 sort()와 order()가 쓰입니다.

1. split

split() 함수는 데이터를 분리하고 실행 결과로 리스트를 산출합니다. 따라서 lapply와 묶어서 사용하기 좋습니다.

lapply(split(iris$Sepal.Length, iris$Species), mean)
## $setosa
## [1] 5.006
## 
## $versicolor
## [1] 5.936
## 
## $virginica
## [1] 6.588

2. subet()

split()과 유사하지만 전체를 구분하여 모두 정렬하는 대신 조건을 만족하는 특정 부분만 빼내는 용도로 사용합니다.

head(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

&나 |를 사용하여 여러 조건을 걸 수도 있습니다.

head(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

select 인자를 지정하면 특정 컬럼을 선택하거나 제외할 수 있습니다. (제외 시 컬럼 앞에 -를 붙입니다)

head(subset(iris, select = c(Sepal.Length, Species)))
##   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
head(subset(iris, select = -c(Sepal.Length, Species)))
##   Sepal.Width Petal.Length Petal.Width
## 1         3.5          1.4         0.2
## 2         3.0          1.4         0.2
## 3         3.2          1.3         0.2
## 4         3.1          1.5         0.2
## 5         3.6          1.4         0.2
## 6         3.9          1.7         0.4

names()와 %in%를 사용해서도 컬럼을 제거할 수 있습니다.

head(iris[ , !names(iris) %in% c("Sepal.Length", "Species")])
##   Sepal.Width Petal.Length Petal.Width
## 1         3.5          1.4         0.2
## 2         3.0          1.4         0.2
## 3         3.2          1.3         0.2
## 4         3.1          1.5         0.2
## 5         3.6          1.4         0.2
## 6         3.9          1.7         0.4

x %in% y 연산자는 y 안에 x가 있는지 논리형 벡터를 산출해 줍니다.

3. merge()

merge()는 기준이 되는 컬럼을 바탕으로 데이터 프레임을 합쳐줍니다.

x <- data.frame(name = c("a", "b", "c"), math = c(1, 2, 3))
y <- data.frame(name = c("c", "a", "b"), english = c(2, 3, 1))
z <- data.frame(korean = c(1, 3, 2), name = c("b", "a", "c"))
merge(x, y)
##   name math english
## 1    a    1       3
## 2    b    2       1
## 3    c    3       2
merge(y, z)
##   name english korean
## 1    a       3      3
## 2    b       1      1
## 3    c       2      2
cbind(y, z)
##   name english korean name
## 1    c       2      1    b
## 2    a       3      3    a
## 3    b       1      2    c

merge()는 공통이 되는 컬럼인 name을 기준으로 잘 병합되지만 cbind()는 정말 가져다 붙이기만 하는 차이가 보입니다.

merge() 함수는 공통된 값이 없을 경우 해당 행을 빼버립니다. 이를 막으려면 all = TRUE 로 설정해야 합니다.

x <- data.frame(name = c("a", "b", "z"), math = c(1, 2, 3))
y <- data.frame(name = c("c", "a", "b"), english = c(2, 3, 1))
merge(x, y)
##   name math english
## 1    a    1       3
## 2    b    2       1
merge(x, y, all = T)
##   name math english
## 1    a    1       3
## 2    b    2       1
## 3    c   NA       2
## 4    z    3      NA

공통되지 않는 값이 포함된 행의 컬럼 값이 NA로 처리된 것을 볼 수 있습니다.

4. sort()

sort() 함수는 주어진 벡터를 정렬한 결과를 반영합니다.

x <- c(10, 15, 30, 25, 12)
sort(x)
## [1] 10 12 15 25 30
sort(x, decreasing = T)
## [1] 30 25 15 12 10

내림 차순을 위해서는 decreasing = T를 넣어줍니다. sort()는 정렬한 결과를 반환할 뿐이지 벡터를 변경하진 않습니다.

5. order()

order()함수는 주어진 인자를 정렬하는데 색인을 산출합니다.

a <- c(10, 20, 300, 40, 50)
order(a)
## [1] 1 2 4 5 3
rank(a)
## [1] 1 2 5 3 4

order()와 rank()의 결과가 다른 이유는, order는 몇 번째 자리의 데이터가 와야 오름차순이 된다 라는 의미이고 랭크는 데이터 값 자체의 오름차순을 보여줍니다.