데이터 분리 및 병합 (split, subset, merge)


split

split: 주어진 조건에 따라서 데이터를 분리 한다.
x # 분리할 벡터 또는 데이터 프레임
f # 분리할 기준을 지정한 factor

iris$Species에 따라서 분리하고 이것을 리스트에 저장 한다.

> head(split(iris, 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

$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

$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

split()의 실행 결과가 리스트므로, split()후 lapply()를 적용하면 iris의 종별 Sepal.Length의 평균을 구할 수 있다.

> lapply(split(iris$Sepal.Length, iris$Species),mean)
$setosa
[1] 5.006

$versicolor
[1] 5.936

$virginica
[1] 6.588

subset()

subset()
x # 일부를 취할 객체
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
18          5.1         3.5          1.4         0.3  setosa
#특정 컬럼을 선택해서 데이터를 추출 한다.
> 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
#특정 컬럼을 제거하는 두가지 서로 다른 스타일의 방법이다.
> 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
7           3.4          1.4         0.3
> 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

merge

merge(): 두 데이터 프레임을 공통된 값을 기준으로 묶는 함수다.
Database에서 join과 같은 역할을 하는 함수 이다.

다음은 name column을 기준으로 수학 점수가 저장된 데이터 프레임과 영어 점수가 저장된 데이터 프레임을 병합한 예이다.
x와 y에 name값이 서로 다른 순서로 저장되어 있으나 공통된 name 값을 기준으로 점수가 잘 병합된 것을 볼 수 있다.

> x <- data.frame(name=c("a","b","c"), math=c(1,2,3))
> y <- data.frame(name=c("c","b","a"), english=c(4,5,6))
> merge(x,y)
  name math english
1    a    1       6
2    b    2       5
3    c    3       4

cbind의 경우 단순히 column만 합치는 것이기 때문에 merge()하고 그 결과가 다르다.

> cbind(x,y)
  name math name english
1    a    1    c       4
2    b    2    b       5
3    c    3    a       6

merge() 수행 시 공통된 값이 한쪽에만 있는 경우에는 반대편 데이터가 비게 되고 이 경우 해당 행은 병합 결과에서 빠진다.
NA를 추가해서라도 전체 데이터를 모두 병합하고 싶다면 all 인자에 TRUE를 지정 한다.

아래의 예제는 all=FALSE(기본값)인 경우와 all=TRUE인 경우의 비교를 보인 것이다.
all=FALSE인 경우에는 공통된 name이 양측에 포함된 "a","b"만 결과에 나타나며, all=TRUE인 경우 공통된 값이 없는 쪽에 NA가 채워지면서 x,y의 전체 행이 결과에 포함된다.

> y <- data.frame(name=c("c","b","d"), english=c(4,5,6))
> merge(x,y)
  name math english
1    b    2       5
2    c    3       4
> merge(x,y, all=TRUE)
  name math english
1    a    1      NA
2    b    2       5
3    c    3       4
4    d   NA       6


  1. 잡다백수 2017.07.05 09:23 신고

    좋은 포스팅 감사합니다.

+ Recent posts