Data.table: λ™μΌν•œ μ—΄λ‘œ 집계 및 κ·Έλ£Ήν™” ν•  λ•Œ 합계가 잘λͺ» λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2018λ…„ 10μ›” 10일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: Rdatatable/data.table

μ•ˆλ…•ν•˜μ„Έμš”. λ™μΌν•œ μ—΄μ—μ„œ 집계 및 κ·Έλ£Ήν™” ν•  λ•Œ data.table의 λ™μž‘μ— ν˜Όλž€μŠ€λŸ¬μ›Œν•©λ‹ˆλ‹€. κ·Έλ£Ήν™”λ˜μ§€ μ•Šμ€ 데이터가 μ•„λ‹Œ κ·Έλ£Ήν™” 된 데이터에 λŒ€ν•΄ 집계 (예 : 합계)λ₯Ό μˆ˜ν–‰ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것이 λ°˜λ“œμ‹œ ν‹€λ Έλ‹€κ³  λ§ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ λ‹€λ₯Έ 도ꡬ와 λ‹€λ₯΄λ©° μ„€λͺ…이 무엇인지 λ˜λŠ” λ‚΄κ°€ λ­”κ°€ 잘λͺ»ν•˜κ³  μžˆλŠ”μ§€ (λ˜λŠ” 이것이 버그 일 κ°€λŠ₯성이 μžˆλŠ”μ§€) κΆκΈˆν•©λ‹ˆλ‹€. κΈ°λŒ€ν–ˆλ˜ 것보닀 더 많이 μˆ˜ν–‰ν•˜λŠ” dplyr (그리고 SQLκ³Ό 더 λΉ„μŠ· 함)에 λŒ€ν•œ 비ꡐλ₯Ό ν¬ν•¨ν–ˆμŠ΅λ‹ˆλ‹€. NB : μš”μ²­ν•œλŒ€λ‘œ 문제, μŠ€νƒ μ˜€λ²„ν”Œλ‘œ 등을 검색해 λ³΄μ•˜μ§€λ§Œμ΄ μ‹œλ‚˜λ¦¬μ˜€μ˜ νŠΉμ„± (λ™μΌν•œ μ—΄ κ·Έλ£Ήν™” 및 집계)은 μ•½κ°„ λ…νŠΉν•˜κ³  μΌμΉ˜ν•˜λŠ” ν•­λͺ©μ„ 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

# Minimal reproducible example

μ•„λž˜ 두 예의 합계 열을 λΉ„κ΅ν•˜μ‹­μ‹œμ˜€. 예λ₯Ό λ“€μ–΄ 값이 3 인 행이 3 개 μžˆμœΌλ―€λ‘œ 합계가 3이 μ•„λ‹Œ 9κ°€ 될 κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

data.table

library(data.table)
df <- data.frame(SomeNumber=c(1,2,3,1,2,3,1,2,3))
dt <- data.table(df)
r <- dt[, .(.N, Total=sum(SomeNumber)), by=SomeNumber]

κ²°κ³Ό (r) :

   SomeNumber N Total
1:          1 3     1
2:          2 3     2
3:          3 3     3

dplyr

library(dplyr)
df <- data.frame(SomeNumber=c(1,2,3,1,2,3,1,2,3))
r <- df %>% group_by(SomeNumber) %>% 
  summarise(N=n(), Total=sum(SomeNumber)) %>%
  ungroup()

κ²°κ³Ό (r) :

   SomeNumber N Total
1:          1 3     3
2:          2 3     6
3:          3 3     9

# Output of sessionInfo()
R 버전 3.5.1 (2018-07-02)
ν”Œλž«νΌ : x86_64-w64-mingw32 / x64 (64 λΉ„νŠΈ)
μ•„λž˜μ—μ„œ μ‹€ν–‰ : Windows> = 8 x64 (λΉŒλ“œ 9200)

맀트릭슀 μ œν’ˆ : κΈ°λ³Έκ°’

μž₯μ†Œ:
[1] LC_COLLATE = μ˜μ–΄ _ 영ꡭ .1252 LC_CTYPE = μ˜μ–΄ _ 영ꡭ .1252 LC_MONETARY = μ˜μ–΄ _ 영ꡭ .1252
[4] LC_NUMERIC = C LC_TIME = μ˜μ–΄ _ 영ꡭ .1252

첨뢀 된 κΈ°λ³Έ νŒ¨ν‚€μ§€ :
[1] 톡계 κ·Έλž˜ν”½ grDevices utils 데이터 μ…‹ λ©”μ†Œλ“œλ² μ΄μŠ€

기타 첨뢀 된 νŒ¨ν‚€μ§€ :
[1] dplyr_0.7.6 data.table_1.11.8 openxlsx_4.1.0 bindrcpp_0.2.2 pivottabler_0.4.0.9000

λ„€μž„ 슀페이슀λ₯Ό ν†΅ν•΄λ‘œλ“œ (μ—°κ²°λ˜μ§€ μ•ŠμŒ) :
[1] Rcpp_0.12.19 rstudioapi_0.8 bindr_0.1.1 magrittr_1.5 tidyselect_0.2.4 R6_2.3.0 rlang_0.2.2 fansi_0.3.0 tools_3.5.1
[10] utf8_1.1.4 cli_1.0.1 htmltools_0.3.6 yaml_2.2.0 assertthat_0.2.0 digest_0.6.17 tibble_1.4.2 crayon_1.3.4 zip_1.0.0
[19] purrr_0.2.5 htmlwidgets_1.3 glue_1.3.0 compiler_3.5.1 κΈ°λ‘₯ _1.3.0 jsonlite_1.5 pkgconfig_2.0.2

bug question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

FAQ에 λŒ€ν•œ λ‹΅λ³€κ³Ό 포인터에 λŒ€ν•΄ @ franknarf1 및 @jangorecki μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.
FAQ 닡변을 읽고 더 λ§Žμ€ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ ν•œ ν›„μ—λŠ” 그룹화에 μ‚¬μš© 된 ν•­λͺ©μ— 따라 λ™μΌν•œ λ°μ΄ν„°κ°€μžˆλŠ” λ‹€λ₯Έ 열을 μ§‘κ³„ν•˜λ©΄ λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜¬ 수 μžˆμœΌλ―€λ‘œ κ·Έλ£Ήν™” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λ§€μš°μ£Όμ˜ν•΄μ•Ό ν•  것 κ°™μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ—¬μ „νžˆ 이것이 μ΄μƒν•˜κ³  μ•½κ°„ μ–΄μƒ‰ν•˜λ‹€κ³  μƒκ°ν•˜μ§€λ§Œ μ•„λ§ˆλ„ 이것은 λ‚΄κ°€ μ΅μˆ™ν•΄ μ Έμ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

예 :

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA)), by=SomeNumberA]

μœ„μ˜ κ²°κ³Ό : TotalA = 1

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalB=sum(SomeNumberB)), by=SomeNumberA]

μœ„μ˜ κ²°κ³Ό : TotalB = 3

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA), TotalB=sum(SomeNumberB)), by=SomeNumberA]

κ²°κ³Ό μ—†μŒ, 였λ₯˜μ™€ ν•¨κ»˜ μ‹€ν–‰ μ‹€νŒ¨ :
gsum (SomeNumberA) 였λ₯˜ : 'SomeNumberA'개체λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  4 λŒ“κΈ€

λ‹€λ₯Έ 도ꡬ와 λ‹€λ₯΄λ©° μ„€λͺ…이 무엇인지 λ˜λŠ” λ‚΄κ°€ λ­”κ°€ 잘λͺ»ν•˜κ³  μžˆλŠ”μ§€ (λ˜λŠ” 이것이 버그 일 κ°€λŠ₯성이 μžˆλŠ”μ§€) κΆκΈˆν•©λ‹ˆλ‹€. κΈ°λŒ€ν–ˆλ˜ 것보닀 더 많이 μˆ˜ν–‰ν•˜λŠ” dplyr (그리고 SQLκ³Ό 더 λΉ„μŠ· 함)에 λŒ€ν•œ 비ꡐλ₯Ό ν¬ν•¨ν–ˆμŠ΅λ‹ˆλ‹€.

j of DT[, j, by] μ—μ„œ by 의 열은 길이가 1μž…λ‹ˆλ‹€.ν•˜μ§€λ§Œ .N*SomeNumber 와 같이 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

dt[, .(.N, Total=.N*SomeNumber), by=SomeNumber]
# or, for efficiency with GForce...
dt[, .(.N), by=SomeNumber][, Total := N*SomeNumber][]

κ·Όκ±°λŠ” "각 κ·Έλ£Ή λ‚΄μ—μ„œ κ·Έλ£Ή λ³€μˆ˜μ˜ 길이가 1 인 μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?"λΌλŠ” μ§ˆλ¬Έμ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. vignette("datatable-faq") λ˜λŠ” https://github.com/Rdatatable/data.table/wiki/Getting-started 의 FAQ λ‚΄λΆ€

FAQ에 λŒ€ν•œ λ‹΅λ³€κ³Ό 포인터에 λŒ€ν•΄ @ franknarf1 및 @jangorecki μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.
FAQ 닡변을 읽고 더 λ§Žμ€ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ ν•œ ν›„μ—λŠ” 그룹화에 μ‚¬μš© 된 ν•­λͺ©μ— 따라 λ™μΌν•œ λ°μ΄ν„°κ°€μžˆλŠ” λ‹€λ₯Έ 열을 μ§‘κ³„ν•˜λ©΄ λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜¬ 수 μžˆμœΌλ―€λ‘œ κ·Έλ£Ήν™” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λ§€μš°μ£Όμ˜ν•΄μ•Ό ν•  것 κ°™μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ—¬μ „νžˆ 이것이 μ΄μƒν•˜κ³  μ•½κ°„ μ–΄μƒ‰ν•˜λ‹€κ³  μƒκ°ν•˜μ§€λ§Œ μ•„λ§ˆλ„ 이것은 λ‚΄κ°€ μ΅μˆ™ν•΄ μ Έμ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

예 :

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA)), by=SomeNumberA]

μœ„μ˜ κ²°κ³Ό : TotalA = 1

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalB=sum(SomeNumberB)), by=SomeNumberA]

μœ„μ˜ κ²°κ³Ό : TotalB = 3

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA), TotalB=sum(SomeNumberB)), by=SomeNumberA]

κ²°κ³Ό μ—†μŒ, 였λ₯˜μ™€ ν•¨κ»˜ μ‹€ν–‰ μ‹€νŒ¨ :
gsum (SomeNumberA) 였λ₯˜ : 'SomeNumberA'개체λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μ€ λ²„κ·Έμž…λ‹ˆλ‹€ ...

이것이 data.table의 κ·Έλ£Ήν™” / 집계 λ°©λ²•μ˜ λ‰˜μ•™μŠ€μΈμ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 단일 λ³€μˆ˜ data.table둜 κ·Έλ£Ήν™” 및 집계 ν•  λ•Œ κ·Έλ£Ήν™” ν˜ΈμΆœμ„ '인수 ν™”'ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

즉, 집계 ν›„ 각 숫자λ₯Ό 자체 그룹으둜 κ³„μ‚°ν•˜λ―€λ‘œ κ·€ν•˜μ˜ κ²½μš°μ—λŠ” μ›λž˜ 9κ°€ μ•„λ‹Œ 3 개의 SomeNumber λ³€μˆ˜ 만 λ‚¨κ²Œλ©λ‹ˆλ‹€.

λΉ λ₯΄κ³  μ‰¬μš΄ μˆ˜μ •μ€ 초기 κ·Έλ£Ήν™” 호좜 λ‚΄μ—μ„œ 인수 λΆ„ν•΄κ°€ λ°œμƒν•˜λ„λ‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

library(data.table)

df <- data.frame(SomeNumber=c(1, 2, 3, 1, 2, 3, 1, 2, 3))

dt <- data.table(df)

r <- dt[, .(.N, Total = sum(SomeNumber)), by = as.factor(SomeNumber)]

   as.factor N Total
1:         1 3     3
2:         2 3     6
3:         3 3     9
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰