'how to concatenate strings after dcast aggregation'에 해당되는 글 1건

  1. 2021.10.24 [R data.table] 문자열 dcast 집계 함수 (1) 개수 (2) 콤마로 구분해서 붙여쓰기 (3) 첫번째 문자열만 가져오기

이번 포스팅에서는 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

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요!  :-)

 

반응형
Posted by Rfriend

댓글을 달아 주세요