[R data.table] 문자열 dcast 집계 함수 (1) 개수 (2) 콤마로 구분해서 붙여쓰기 (3) 첫번째 문자열만 가져오기
R 분석과 프로그래밍/R 데이터 전처리 2021. 10. 24. 21:45이번 포스팅에서는 R의 data.table 패키지의 dcast() 함수를 사용해서 문자열(string)을 대상으로 데이터를 재구조화할 때 집계 함수 (aggregation function) 로서
(1) 문자열 원소의 개수 (length)
(2) 문자열을 콤마로 구분해서 붙여쓰기
(3) 첫번째 문자열만 가져오기
하는 방법을 소개하겠습니다.
먼저 간단한 예제 data.table을 만들어보겠습니다.
##---------------------------------
## R data.table dcast() for string
##---------------------------------
#install.packages("data.table")
library(data.table)
x1 <- c('g1', 'g1', 'g1', 'g1', 'g2', 'g2', 'g2', 'g2')
x2 <- c('v1', 'v2', 'v3', 'v3', 'v1', 'v2', 'v2', 'v3')
x3 <- c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
dt <- data.table(x1, x2, x3)
print(dt)
# x1 x2 x3
# 1: g1 v1 a
# 2: g1 v2 b
# 3: g1 v3 c
# 4: g1 v3 d
# 5: g2 v1 e
# 6: g2 v2 f
# 7: g2 v2 g
# 8: g2 v3 h
R 의 data.table 패키지의 dcast() 함수를 사용해 데이터를 재구조화하면서 문자열을 대상으로 집계(value.var)를 할 때 집계 함수 (aggregation function) 을 명시적으로 적어주지 않으면 아래와 같은 경고 메시지가 발생합니다.
Warning message: Aggregate function missing, defaulting to 'length'
이것은 문자열을 대상으로는 합계(sum), 최소값(min), 최대값(max), 평균(mean) 등의 숫자형을 대상으로 하는 요약통계량을 사용할 수 없기 때문입니다.
##-- warning message
##: Aggregate function missing, defaulting to 'length'
dcast(dt, x1 ~ x2,
value.var = "x3")
# Aggregate function missing, defaulting to 'length'
# x1 v1 v2 v3
# 1: g1 1 1 2
# 2: g2 1 2 1
따라서 dcast() 함수로 데이터를 재고조화시 문자열을 대상으로 집계를 한다면
(1) 문자열 원소의 개수 (length)
(2) 문자열을 콤마로 구분해서 붙여쓰기
(3) 첫번째 문자열만 가져오기
와 같이 문자열에 맞는 집계함수를 지정해주어야 합니다.
(1) dcast() 함수로 데이터셋 재구조화 시 문자열을 원소의 개수 (length) 로 집계
문자열 대상 집계일 때는 default 설정이 원소의 개수 (length) 이므로 위와 결과는 동일합니다만, 이번에는 경고 메시지가 안떴습니다.
##-- (1) counting the number of values as an aggregation function for string values
dcast(dt, x1 ~ x2,
fun.aggregate = length,
value.var = "x3")
# x1 1 2 3
# 1: g1 1 1 2
# 2: g2 1 2 1
(2) dcast() 함수로 데이터셋 재구조화 시 문자열을 콤마로 구분해서 붙여쓰기
dcast() 로 재구조화 시 하나의 셀 안에 여러개의 원소가 존재하게 될 경우, 이들 문자열 원소들을 콤마로 구분해서 옆으로 나란히 붙여서 집계하는 사용자 정의 함수를 fun.aggregate 매개변수란에 써주었습니다.
##-- (2) concatenation as an aggregation function for string values
dcast(dt, x1 ~ x2,
fun.aggregate = function(x) if (length(x)==1L) x else paste(x, collapse=","),
value.var = "x3")
# x1 1 2 3
# 1: g1 a b c,d
# 2: g2 e f,g h
(3) dcast() 함수로 데이터셋 재구조화 시 첫번째 문자열만 가져오기
dcast() 로 재구조화 시 하나의 셀 안에 여러개의 원소가 존재하게 될 경우, 이들 복수개의 원소들 중에서 첫번째 원소만 가져오는 사용자정의함수를 fun.aggregate 매개변수란에 작성해주었습니다.
##-- (3) keeping the first value as an aggregation function for string values
dcast(dt, x1 ~ x2,
fun.aggregate = function(x) if (length(x)==1L) x else x[1],
value.var = "x3")
# x1 1 2 3
# 1: g1 a b c
# 2: g2 e f h
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요! :-)
'R 분석과 프로그래밍 > R 데이터 전처리' 카테고리의 다른 글
[R] 실업률과 취업자수 데이터 전처리 및 시각화 (2) | 2022.10.10 |
---|---|
[R] data.frame의 여러개 칼럼 이름을 old_col:new_col 의 매핑 테이블을 사용해서 변경하기 (13) | 2022.01.09 |
[R] 시계열 데이터의 이동 평균, 누적 평균 구하기 (Average of time series using Rolling windows vs. Expanding windows) (4) | 2021.10.13 |
[R data.table] 자동 인덱싱(Auto indexing)을 통한 빠른 탐색과 Subsetting (0) | 2021.02.11 |
[R data.table] 2차 인덱스 (secondary indices) 를 활용한 빠른 탐색 기반 Subsetting (0) | 2021.02.07 |