작성자: admin 작성일시: 2016-09-29 19:54:19 조회수: 104 다운로드: 22
카테고리: R 태그목록:

R 데이터프레임 합성

두 개의 데이터프레임을 합성하여 새로운 데이터프레임을 만들 수도 있다. 이러한 작업을 데이터베이스에서는 테이블 조인(join) 혹은 테이블 머지(merge)라고 한다.

bind 명령

열 혹은 행이 공통적인 두 데이터프레임을 단순히 옆으로 붙이거나 위아래로 붙이는 경우에는 rbind, cbind 명령을 사용한다.

In [3]:
df1 <- data.frame(c1=1:2, c2=3:4, row.names=c('r1', 'r2'))
df1
c1c2
r113
r224
In [4]:
df2 <- data.frame(c1=5:6, c2=7:8, row.names=c('r3', 'r4'))
df2
c1c2
r357
r468
In [5]:
rbind(df1, df2)
c1c2
r113
r224
r357
r468
In [6]:
df2 <- data.frame(c3=5:6, c4=7:8, row.names=c('r1', 'r2'))
df2
c3c4
r157
r268
In [7]:
cbind(df1, df2)
c1c2c3c4
r11357
r22468

merge 명령

R에서 데이터프레임을 합성하는 명령은 merge이다. merge 명령을 사용하면 두 데이터프레임에 공통적인 이름을 키(key)로 사용해서 데이터를 합친다.

In [3]:
df1 <- data.frame(key=c('b', 'b', 'a', 'c', 'a', 'a', 'b'), data1=0:6)
df1
keydata1
b0
b1
a2
c3
a4
a5
b6
In [6]:
df2 <- data.frame(key=c('a', 'b', 'd'), data2=0:2)
df2
keydata2
a0
b1
d2
In [7]:
merge(df1, df2)
keydata1data2
a20
a40
a50
b01
b11
b61

합성 방식

다음 인수를 사용하면 합치는 방식을 변경할 수 있다.

  • all: TRUE이면 두 데이터프레임의 키 열의 모든 데이터를 포함
  • all.x: TRUE이면 첫번째 데이터프레임의 키 열의 모든 데이터를 포함
  • all.y: TRUE이면 두번째 데이터프레임의 키 열의 모든 데이터를 포함
In [8]:
merge(df1, df2, all=T)
keydata1data2
a 2 0
a 4 0
a 5 0
b 0 1
b 1 1
b 6 1
c 3NA
d NA 2
In [9]:
merge(df1, df2, all.x=T)
keydata1data2
a 2 0
a 4 0
a 5 0
b 0 1
b 1 1
b 6 1
c 3 NA
In [10]:
merge(df1, df2, all.y=T)
keydata1data2
a 20
a 40
a 50
b 01
b 11
b 61
d NA2

열 이름이 지정되지 않으면 공통적인 열을 모두 찾아서 그 조합을 키로 사용한다.

In [11]:
df1 <- data.frame(key1=c('foo', 'foo', 'bar'),
                  key2=c('one', 'two', 'one'), 
                  lval=1:3)
df1
key1key2lval
fooone1
footwo2
barone3
In [13]:
df2 <- data.frame(key1=c('foo', 'foo', 'bar', 'bar'),
                  key2=c('one', 'one', 'one', 'two'), 
                  rval=4:7)
df2
key1key2rval
fooone4
fooone5
barone6
bartwo7
In [16]:
merge(df1, df2, all=T)
key1key2lvalrval
barone 3 6
bartwoNA 7
fooone 1 4
fooone 1 5
footwo 2 NA

만약 이름은 같더라도 공통 키가 아닌 열이 있다면 키가 되는 열을 수동으로 지정해야 한다.

In [17]:
merge(df1, df2, by="key1")
key1key2.xlvalkey2.yrval
barone3 one6
barone3 two7
fooone1 one4
fooone1 one5
footwo2 one4
footwo2 one5

이 때 이름은 공통이지만 키가 아닌 열의 이름은 .x, .y가 붙어서 구별한다. 이 구별자는 suffixes 인수로 바꿀 수 있다.

In [18]:
merge(df1, df2, by="key1", suffixes=c('_left', '_right'))
key1key2_leftlvalkey2_rightrval
barone3 one6
barone3 two7
fooone1 one4
fooone1 one5
footwo2 one4
footwo2 one5

만약 공통 키가 되는 열의 이름이 두 데이터프레임에서 같지 않다면 by.x, by.y 인수로 각각 지정해 주어야 한다.

In [19]:
df1 <- data.frame(key1=c('foo', 'foo', 'bar'),
                  key2=c('one', 'two', 'one'), 
                  lval=1:3)
df1
key1key2lval
fooone1
footwo2
barone3
In [20]:
df2 <- data.frame(k1=c('foo', 'foo', 'bar', 'bar'),
                  k2=c('one', 'one', 'one', 'two'), 
                  rval=4:7)
df2
k1k2rval
fooone4
fooone5
barone6
bartwo7
In [21]:
merge(df1, df2, by.x='key1', by.y="k1")
key1key2lvalk2rval
barone3 one6
barone3 two7
fooone1 one4
fooone1 one5
footwo2 one4
footwo2 one5

다음 예에서 authors 데이터프레임은 저자 정보를 books 데이터프레임은 저자를 포함한 서적 정보를 가지고 있다. 여기에서 저자 정보가 양쪽 데이터프레임에 있으므로 이를 이용하면 두 데이터프레임을 합칠 수 있다.

In [1]:
authors <- data.frame(
    surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")),
    nationality = c("US", "Australia", "US", "UK", "Australia"),
    deceased = c("yes", rep("no", 4)))
authors
surnamenationalitydeceased
Tukey US yes
Venables Australiano
Tierney US no
Ripley UK no
McNeil Australiano
In [2]:
books <- data.frame(
    name = I(c("Tukey", "Venables", "Tierney",
             "Ripley", "Ripley", "McNeil", "R Core")),
    title = c("Exploratory Data Analysis",
              "Modern Applied Statistics ...",
              "LISP-STAT",
              "Spatial Statistics", "Stochastic Simulation",
              "Interactive Data Analysis",
              "An Introduction to R"),
    other.author = c(NA, "Ripley", NA, NA, NA, NA,
                     "Venables & Smith"))
books
nametitleother.author
Tukey Exploratory Data Analysis NA
Venables Modern Applied Statistics ...Ripley
Tierney LISP-STAT NA
Ripley Spatial Statistics NA
Ripley Stochastic Simulation NA
McNeil Interactive Data Analysis NA
R Core An Introduction to R Venables & Smith
In [22]:
merge(authors, books, by.x = "surname", by.y = "name")
surnamenationalitydeceasedtitleother.author
McNeil Australia no Interactive Data Analysis NA
Ripley UK no Spatial Statistics NA
Ripley UK no Stochastic Simulation NA
Tierney US no LISP-STAT NA
Tukey US yes Exploratory Data Analysis NA
Venables Australia no Modern Applied Statistics ...Ripley

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!