Programming/R

[R기초] 데이터 재구조화

aram 2023. 7. 27. 12:27

 

merge(병합) 

  • 두 개의 데이터프레임을 합하는 기능. 컬럼을 기준으로 데이터 병합
  • merge(A, B) : 컬럼명의 값이 같은 데이터만 병합
  • merge(A, B, by="key컬럼") : merge의 key값이 같은 데이터만 병합 [inner join]
cust_id <- c("c01","c02","c03","c04","c05","c06","c07")
last_name <- c("Kim","Lee","Choi","Park","Bae","Kim","Lim")
cust1 <- data.frame(cust_id, last_name)
  #   cust_id last_name
  # 1     c01       Kim
  # 2     c02       Lee
  # 3     c03      Choi
  # 4     c04      Park
  # 5     c05       Bae
  # 6     c06       Kim
  # 7     c07       Lim

cust2 <- data.frame(cust_id=c("c05","c06","c07","c08","c09")
                    , last_name=c("Bae","Kim","Lim2","Cho","Yoo"))
  #   cust_id last_name
  # 1     c05       Bae
  # 2     c06       Kim
  # 3     c07       Lim
  # 4     c08       Cho
  # 5     c09       Yoo

cust3 = merge(cust1, cust2)
  #   cust_id last_name
  # 1     c05       Bae
  # 2     c06       Kim

cust3 = merge(cust1, cust2, by="cust_id")
  #   cust_id last_name.x last_name.y
  # 1     c05         Bae         Bae
  # 2     c06         Kim         Kim
  # 3     c07         Lim        Lim2
  • [full outer join] : merge(A, B, by="key컬럼", all=TRUE) key를 기준으로 모든 데이터 병합
cust4 = merge(cust1, cust2, by="cust_id", all=TRUE)
  #   cust_id last_name.x last_name.y
  # 1     c01         Kim        <NA>
  # 2     c02         Lee        <NA>
  # 3     c03        Choi        <NA>
  # 4     c04        Park        <NA>
  # 5     c05         Bae         Bae
  # 6     c06         Kim         Kim
  # 7     c07         Lim        Lim2
  # 8     c08        <NA>         Cho
  # 9     c09        <NA>         Yoo
  • [left outer join] : merge(A, B, by="key컬럼", all.x=TRUE) key를 기준으로 모든 x데이터만 병합
cust5 = merge(cust1, cust2, by="cust_id", all.x=TRUE)
cust5
  #   cust_id last_name.x last_name.y
  # 1     c01         Kim        <NA>
  # 2     c02         Lee        <NA>
  # 3     c03        Choi        <NA>
  # 4     c04        Park        <NA>
  # 5     c05         Bae         Bae
  # 6     c06         Kim         Kim
  # 7     c07         Lim        Lim2
  • [right outer join] : merge(A, B, by="key컬럼", all.y=TRUE) key를 기준으로 모든 y데이터만 병합
cust6 = merge(cust1, cust2, by="cust_id", all.y=TRUE)
cust6
  #   cust_id last_name.x last_name.y
  # 1     c05         Bae         Bae
  # 2     c06         Kim         Kim
  # 3     c07         Lim        Lim2
  # 4     c08        <NA>         Cho
  # 5     c09        <NA>         Yoo

 

python의 concat과 같은 기능 - 단순히 붙이는 기능

- rbind() : dataframe 행 추가

df1 = data.frame(name=c('apple', 'banana','cherry'), price=c(300,200,100))
  #     name price
  # 1  apple   300
  # 2 banana   200
  # 3 cherry   100

# 행추가
df2 <- data.frame(name=c('mango','berry'), price=c(400, 500))
df1 <- rbind(df1, df2)
  #     name price
  # 1  apple   300
  # 2 banana   200
  # 3 cherry   100
  # 4  mango   400


- c
bind() : dataframe 열 추가

# 열추가. 행 수가 같아야함
df1 <- cbind(df1, data.frame(qty=c(10,20,30,40,50)))
df1
  #     name price
  # 1  apple   300
  # 2 banana   200
  # 3 cherry   100
  # 4  mango   400
  # 5  berry   500

 

subset

  • subset(data, select=컬럼명|vector) : 부분 데이터만 리턴
  • select = -컬럼 : -를 하면 해당 컬럼 제외하고 나머지 리턴
no <- c(1,2,3,4,5)
name <- c('서진수','주시현','최경우','이동근','윤정웅')
address <- c('서울','대전','포항','경주','경기')
tel <- c(1111,2222,3333,4444,5555)
hobby <- c("독서","미술","여행","요리","운동")
member <- data.frame(NO=no, NAME=name, ADDRESS=address, TEL=tel, HOBBY=hobby)
member
  #   NO   NAME ADDRESS  TEL HOBBY
  # 1  1 서진수    서울 1111  독서
  # 2  2 주시현    대전 2222  미술
  # 3  3 최경우    포항 3333  여행
  # 4  4 이동근    경주 4444  요리
  # 5  5 윤정웅    경기 5555  운동

#번호, 이름, 전화번호만 저장
member2 <- subset(member, select=c(NO,NAME,TEL))
member2
  #   NO   NAME  TEL
  # 1  1 서진수 1111
  # 2  2 주시현 2222
  # 3  3 최경우 3333
  # 4  4 이동근 4444
  # 5  5 윤정웅 5555

# 취미만 제외
member3 <- subset(member, select=-HOBBY)
member3
  #   NO   NAME ADDRESS  TEL
  # 1  1 서진수    서울 1111
  # 2  2 주시현    대전 2222
  # 3  3 최경우    포항 3333
  # 4  4 이동근    경주 4444
  # 5  5 윤정웅    경기 5555

 

* 내용참고&출처 : 태그의 수업을 복습 목적으로 정리한 내용입니다.

728x90