Data.table: ๋กค๋ง ํ•จ์ˆ˜, ๋กค๋ง ์ง‘๊ณ„, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ, ์ด๋™ ํ‰๊ท 

์— ๋งŒ๋“  2018๋…„ 04์›” 21์ผ  ยท  39์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Rdatatable/data.table

ํ•œ ๊ณณ์—์„œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ˆ˜์ง‘ํ•˜๊ณ  _๋กค๋ง ๊ธฐ๋Šฅ_ ๊ธฐ๋Šฅ(_๋กค๋ง ์ง‘๊ณ„_, _์Šฌ๋ผ์ด๋”ฉ ์ฐฝ_ ๋˜๋Š” _์ด๋™ ํ‰๊ท _/_์ด๋™ ์ง‘๊ณ„_๋ผ๊ณ ๋„ ํ•จ)์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•œ ~4๋…„ ๋œ ํ† ๋ก ์„ ์ƒˆ๋กœ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด.

๋กค๋ง ๊ธฐ๋Šฅ

  • [x] ๋กค ํ‰๊ท 
  • [x] ๋กค์„ฌ
  • [ ] ๋กค๋ฏผ
  • [ ] ๋กค๋งฅ์Šค
  • [ ] ๋กค๋ฏธ๋””์–ธ
  • [ ] ๋กคํ”„๋กœ๋“œ
  • [ ] ๋กค๋“œ
  • [ ] ๋กค๋ฐ”
  • [ ] ๋กค๋žญํฌ
  • [x] ๋กค ์ ์šฉ(์‚ฌ์šฉ์ž ์ œ๊ณต FUN)
  • [ ] ๋กค ํšŒ๊ท€(๋งค์šฐ ์š”๊ตฌ๋จ)
  • [ ] ๋กค์ฝ”?
  • [ ] ๋กค์ฝ”๋ธŒ?

ํŠน์ง•

  • [x] ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์—ด
  • [x] ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์ฐฝ
  • [x] ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์—ด๊ณผ ์—ฌ๋Ÿฌ ์ฐฝ
  • [x] ์›์ž ๋ฒกํ„ฐ ์ž…๋ ฅ ๋ฐ ๋‹จ์ผ ์ฐฝ์—์„œ ์›์ž ๋ฒกํ„ฐ ๋ฐ˜ํ™˜
  • [x] ๋ฒกํ„ฐ์˜ ๋‹ค์–‘ํ•œ ๊ธธ์ด ๋ชฉ๋ก
  • [x] ์ •๋ ฌ: ์™ผ์ชฝ/์ค‘์•™/์˜ค๋ฅธ์ชฝ
  • [x] NA ์ฒ˜๋ฆฌ
  • [x] ์ฑ„์šฐ๊ธฐ ์ƒ์ˆ˜
  • [x] ๊ธด ๋ฒกํ„ฐ ์ง€์›
  • [ ] ๋ถ€๋ถ„ ์ฐฝ ์ง€์›(ํ•„์š”ํ•œ ๊ฒฝ์šฐ ea766f2499034cedf6abf872440268b78979147c์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)
  • [x] ์ ์‘ํ˜• ์ฐฝ ์ง€์›
  • [x] openmp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์—ด/์ฐฝ์˜ ๊ณ„์‚ฐ์„ ๋ณ‘๋ ฌํ™”
  • [x] ๋ฐ˜์˜ฌ๋ฆผ ์˜ค๋ฅ˜ ์ˆ˜์ •
  • [x] ๋ณ‘๋ ฌ ์˜์—ญ์—์„œ ์ƒ์„ธ ๋ชจ๋“œ์˜ ํƒ€์ด๋ฐ(~#3422~, #3423์— ์˜ํ•ด ์ฐจ๋‹จ๋จ)
feature request

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@mattdowle PR์˜ ์งˆ๋ฌธ์— ๋‹ต๋ณ€

์™œ data.table ๋‚ด์—์„œ ์ด๊ฒƒ์„ ํ•ฉ๋‹ˆ๊นŒ? ๊ธฐ์กด ํŒจํ‚ค์ง€์— ๊ธฐ์—ฌํ•˜๊ณ  data.table์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ†ตํ•ฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  1. data.table์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” 3๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๋Ÿฌ SO ์งˆ๋ฌธ์— data.table ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด๊ฒƒ์ด data.table์˜ ๋ฒ”์œ„์— ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
  2. data.table์€ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์— ์™„๋ฒฝํ•˜๊ฒŒ ์ ํ•ฉํ•˜๋ฉฐ ๋กค๋ง ์ง‘๊ณ„๋Š” ๊ฑฐ๊ธฐ์—์„œ ๋งค์šฐ ์œ ์šฉํ•œ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—๋Š” ๊ตฌ๋ฌธ(data.table์— ๋‚ด์žฅ๋œ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ, ์˜ˆ๋ฅผ ๋“ค์–ด [...] ๋‚ด๋ถ€ ๋ฐ ์ตœ์ ํ™”๋จ) ๋ฐ data.table ๋‚ด๋ถ€๋ฅผ C ์ˆ˜์ค€์˜ ๋กค๋ง ํ•จ์ˆ˜์— ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด froll*์€ data.table ์ธ๋ฑ์Šค์™€ ํ‚ค๋ฅผ ์ธ์‹ํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ„๋‹จํ•œ ์งง์€ ์˜ˆ.

๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์€ ์†๋„์™€ ์ข…์†์„ฑ ์ฒด์ธ์˜ ๋ถ€์กฑ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์ฆ˜์—๋Š” ๋‹ฌ์„ฑํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ‚ค/์ธ๋ฑ์Šค๋Š” frollmin/frollmax์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์ธก์ • ๋ณ€์ˆ˜์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ธก์ • ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ๊ณ  ์•„์ง ์ตœ์†Œ/์ตœ๋Œ€์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋กค* ํ˜ธ์ถœ ํ›„์— ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—(๋น„๋กค๋ง ํ‰๊ท , ํ•ฉ๊ณ„ ๋“ฑ๊ณผ ๋ฐ˜๋Œ€) GForce ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์˜๋ฏธ๊ฐ€ ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค.

ํ†ตํ•ฉ์— ๋Œ€ํ•œ ์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ์ด ์—†์œผ๋ฉด ๋Œ€์‹  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ๊ธฐ์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์— ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋‚˜์—ดํ–ˆ๋Š”๋ฐ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์œผ๋ฉด data.table ์‚ฌ์šฉ์ž์—๊ฒŒ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ํŠธ์œ„ํ„ฐ์— ์งˆ๋ฌธํ•˜์—ฌ ์‘๋‹ต์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์˜ค๋žซ๋™์•ˆ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์ด ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  39 ๋Œ“๊ธ€

์ œ์•ˆ๋œ rollmean ๊ตฌํ˜„, ๋‹จ์ˆœํ™”.

x = data.table(v1=1:5, v2=1:5)
k = c(2, 3)
i - single column
j - single window
m - int referring to single row
w - current row's sum of rolling window
r - answer for each i, j



md5-be70673ef4a3bb883d4f334bd8fadec9



for i in x
  for j in k
  r = NA_real_
  w = 0
    for m in 1:length(i)
      w = w + i[m]
      w = w - i[m-j]
      r[m] = w / j

์˜ˆ, ๋” ๋งŽ์€ ๋กค๋ง ๊ธฐ๋Šฅ์ด ๋™์ผํ•œ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค(
๋กค๋ง ํ‘œ์ค€ ํŽธ์ฐจ/๊ธฐ๋Œ€ ๊ธฐ๋ฐ˜ ๋ชจ๋ฉ˜ํŠธ ๋ฐ ๋ชจ๋“  ํ•จ์ˆ˜
+ ๋Œ€์‹  ๋ฐ˜์ „ ๊ฐ€๋Šฅํ•œ *๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด์—์„œ ์ง‘๊ณ„ํ•˜๋Š” ๋กค ์ œํ’ˆ๊ณผ ๊ฐ™์€
์ฐฝ

์ €๋Š” ํ•ญ์ƒ ๋กค๋ง ์ฐฝ ๊ธฐ๋Šฅ์„ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒน์น˜๋Š” ๊ทธ๋ฃน(์ฐฝ)์œผ๋กœ ๊ทธ๋ฃนํ™” ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด API๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DT[i, j,
   by = roll(width=5, align="center")]

๊ทธ๋Ÿฐ ๋‹ค์Œ j ์— mean(A) ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ rollmean(A) ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ง€๊ธˆ gmean() ๋กœ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜๋Š” j ๋Š” ์ž„์˜๋กœ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๊ฐ ์ฐฝ์— ๋Œ€ํ•ด ํšŒ๊ท€ ์‹คํ–‰). ์ด ๊ฒฝ์šฐ .SD data.table์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. -- ์ •ํ™•ํžˆ๋Š” ๊ทธ๋ฃน๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฐ”๋กœ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 10๊ฐœ ์ด์ƒ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  data.table-y์˜ ์ •์‹ ๋„ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๋„ค ๋™์˜ํ•ฉ๋‹ˆ๋‹ค

2018๋…„ 4์›” 21์ผ ํ† ์š”์ผ ์˜คํ›„ 3:38 Pasha Stetsenko [email protected]
์ผ๋‹ค:

๋‚˜๋Š” ํ•ญ์ƒ ๋กค๋ง ์ฐฝ ๊ธฐ๋Šฅ์„ ๊ทธ๋ฃนํ™” ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฒน์น˜๋Š” ๊ทธ๋ฃน(์ฐฝ)์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด API๊ฐ€ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๊ฐ™์€:

DT[i,j,
by = ๋กค(๋„ˆ๋น„=5, ์ •๋ ฌ="์ค‘์•™")]

๊ทธ๋Ÿฐ ๋‹ค์Œ j์— mean(A)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
rollmean(A) -- ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ gmean()์œผ๋กœ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜๋Š” j ์ˆ˜
์ž„์˜๋กœ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(์˜ˆ:
๊ฐ ์ฐฝ), ์ด ๊ฒฝ์šฐ .SD data.table์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ
์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ๊ทธ๋ฃน์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 10๊ฐœ ์ด์ƒ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€
data.table-y์˜ ์ •์‹ ๋„ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Rdatatable/data.table/issues/2778#issuecomment-383275134 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AHQQdbADiE4aAI1qPxPnFXUM5gR-0w2Tks5tquH8gaJpZM4TeTQf
.

@st-pasha ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด๋Š” data.table-y ์ •์‹ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋งŽ์€ ์ œํ•œ์ด ์žˆ์œผ๋ฉฐ ์ด ๋ฒ”์ฃผ์˜ ๊ธฐ๋Šฅ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


  • ๊ทธ๋ฃน๋ณ„๋กœ ๋กค ํ‰๊ท ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•
DT[, rollmean(V1, 3), by=V2]
  • ๋‹ค๋ฅธ ์—ด์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ฐฝ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•
DT[, .(rollmean(V1, 3), rollmean(V2, 100))]
  • ์ด์ œ ์‹œํ”„ํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ [.data.table ์™ธ๋ถ€์—์„œ ๋กค ํ‰๊ท ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•
rollmean(rnorm(10), 3)
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•
DT[, .(rollmean(list(V1, V2), c(5, 20)), rollmean(list(V2, V3), c(10, 30)))]
  • ๋™์ผํ•œ j ํ˜ธ์ถœ์—์„œ mean ๋ฐ rollmean j ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•
DT[, .(rollmean(V1, 3), mean(V1)), by=V2]

์ผ๋ฐ˜์ ์œผ๋กœ by ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์ ์€ ์ˆ˜์˜ ํ–‰์œผ๋กœ ์ง‘๊ณ„ํ•˜๋Š” ๋ฐ˜๋ฉด ๋กค๋ง ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ์ž…๋ ฅ๊ณผ ๋™์ผํ•œ ๊ธธ์ด์˜ ๋ฒกํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. SQL์—์„œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ•จ์ˆ˜์—๋Š” ๋‹ค์Œ ์Šคํƒ€์ผ์˜ API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT AVG(value) OVER (ROWS BETWEEN 99 PRECEDING AND CURRENT ROW)
FROM tablename;

์—ฌ์ „ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด GROUP BY์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT AVG(value) OVER (ROWS BETWEEN 99 PRECEDING AND CURRENT ROW)
FROM tablename
GROUP BY group_columns;

๊ทธ๋ž˜์„œ SQL์—์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์— ์ฒด๋ฅ˜ SELECT ๋ฅผ ์˜๋ฏธํ•˜๋Š” j DT์—.
DT์—์„œ๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DT[, rollmean(value, 100)]
DT[, rollmean(value, 100), group_columns]

๋กค๋ง ํ•จ์ˆ˜๋Š” shift ์™€ ๋™์ผํ•œ ๋ฒ”์ฃผ์˜ ํ•จ์ˆ˜์— ์ ํ•ฉํ•˜๋ฉฐ ์ž…๋ ฅ ์‹œ ๋™์ผํ•œ ์ˆ˜์˜ ํ–‰์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
SQL์˜ ์‹œํ”„ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SELECT LAG(value, 1) OVER ()
FROM tablename;

mean ๋ฐ rollmean ๋Š” ๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฒ”์ฃผ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๊ทธ๋ฃน์— ๋”ฐ๋ผ ์ง‘๊ณ„ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ „ํ˜€ ์ง‘๊ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋กค๋ง ํ•จ์ˆ˜ ์œ ํ˜•์— GROUP BY ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” SQL์—์„œ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ mean ์™€ ๊ฐ™์€ ์ง‘๊ณ„์—๋Š” GROUP BY ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฃนํ™”ํ•  ๋•Œ ์ตœ์ข…์ ์œผ๋กœ ์ด ๋ถ€์—ฌ ๊ธˆ์•ก์„ ์–ป์Œ). ์ ˆ์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ).
mean ๋Œ€ํ•ด ์ ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ตœ์ ํ™” ๊ทœ์น™์„ ์ ์šฉํ•˜๋ ค๋Š” ๊ฐ•๋ ฅํ•œ ์ด์œ ๋Š” ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ๋•Œ์™€ ๋ชจ๋“  ๊ฒƒ์€ data.table-y๋ฅผ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์˜ํ˜ผ. ํ˜„์žฌ ์ œ์•ˆ๋„ data.table-y ์ •์‹ ์ด๋ฉฐ := ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ shift := ์™€ ์‰ฝ๊ฒŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ data.table์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@jangorecki ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ์œ ํšจํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‚ฌ๋žŒ๋งˆ๋‹ค ๊ฒฝํ—˜์ด ๋‹ค๋ฅด๊ณ  ๋ฌด์—‡์ด "์ž์—ฐ์ "์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ด€์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋ฃน๋ณ„๋กœ ๋กค ํ‰๊ท ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ DT[, mean(V1), by=.(V2, roll(3))] 2-๋ ˆ๋ฒจ ๊ทธ๋ฃนํ™”์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๊ตฌ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์—ด์—์„œ ๋‹ค๋ฅธ ์ฐฝ ํฌ๊ธฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค ...

์ด์ „์— ๋กค๋ง ์กฐ์ธ์— ๋Œ€ํ•œ SQL ๊ตฌ๋ฌธ์„ ๋ณธ ์ ์ด ์—†์Œ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. AVG ์™€ ๊ฐ™์€ ํ‘œ์ค€ ์ง‘๊ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ์œˆ๋„์šฐ ์‚ฌ์–‘์„ ์ ์šฉํ•œ๋‹ค๋Š” ์ ์€ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. Transact-SQL ์„ค๋ช…์„œ๋ฅผ ๋ณด๋ฉด ๋…ผ๋ฆฌ์ /๋ฌผ๋ฆฌ์  ํ–‰ ์„ ํƒ ๊ฐ„์˜ ๊ตฌ๋ณ„๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ์—ด์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ "OVER" ์—ฐ์‚ฐ์ž๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ์˜ˆ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋˜๋Š” ๋™์ผํ•œ OVER ์ ˆ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ๋‹จ์ผ roll() ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต ํšŸ์ˆ˜๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด SO ์งˆ๋ฌธ ์€ OVER ๊ตฌ๋ฌธ์ด SQL์— ๋„์ž…๋œ ์ด์œ ์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

GROUP BY SalesOrderID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ GROUP BY๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด GROUP BY์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์—ด์— ๋Œ€ํ•œ ์ง‘๊ณ„ ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ, GROUP BY ๋Œ€์‹  ์ฐฝ ์ง‘๊ณ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง‘๊ณ„๋œ ๊ฐ’๊ณผ ์ง‘๊ณ„๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์˜ˆ์ œ ์ฟผ๋ฆฌ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋™์ผํ•œ SalesOrderID ๊ทธ๋ฃน์— ๋Œ€ํ•ด ๊ฐœ๋ณ„ OrderQty ๊ฐ’๊ณผ ํ•ด๋‹น ํ•ฉ๊ณ„, ๊ฐœ์ˆ˜, ํ‰๊ท  ๋“ฑ์„ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ตฌ๋ฌธ์€ group-by ๊ฒฐ๊ณผ๊ฐ€ ์ง‘๊ณ„๋˜์ง€ ์•Š์€ ๊ฐ’๊ณผ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์—†๋Š” ํ‘œ์ค€ SQL์˜ ์ œํ•œ์„ ์šฐํšŒํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(์ฆ‰, ๋™์ผํ•œ ํ‘œํ˜„์‹์—์„œ A ๋ฐ mean(A) ๋ฅผ ๋ชจ๋‘ ์„ ํƒ). ๊ทธ๋Ÿฌ๋‚˜ data.table ์—๋Š” ์ด๋Ÿฌํ•œ ์ œํ•œ์ด ์—†์œผ๋ฏ€๋กœ ๊ตฌ๋ฌธ ์„ ํƒ์— ๋” ๋งŽ์€ ์ž์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์ปค๋ธŒ๋ณด๋‹ค ์•ž์„œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋” ๋„“์€ ๊ด€์ ์—์„œ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "๋กค๋ง" ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€, ์šฉ๋„๊ฐ€ ๋ฌด์—‡์ธ์ง€, ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์ž…๋‹ˆ๋‹ค. ํ†ต๊ณ„ํ•™์ž์˜ ๊ด€์ ์—์„œ:

"๋กค๋ง ํ‰๊ท " ๊ธฐ๋Šฅ์€ ์ผ๋ถ€ ๋…ธ์ด์ฆˆ ์ž…๋ ฅ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๊ด€์ฐฐ์ด ์žˆ๊ณ  "ํ‰๊ท  ์ˆ˜๋Ÿ‰"์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋งค์šฐ ๋Š๋ฆฌ์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ "์ง€๋‚œ 100๊ฐœ ๊ด€์ธก์น˜์— ๋Œ€ํ•œ ์ด๋™ ํ‰๊ท " ๋˜๋Š” "๋ชจ๋“  ์ด์ „ ๊ด€์ธก์น˜์— ๋Œ€ํ•œ ์ด๋™ ํ‰๊ท "์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์‚ฌํ•˜๊ฒŒ, ์ž…๋ ฅ ๋ฒ”์œ„์—์„œ ํŠน์ • ์ˆ˜๋Ÿ‰์„ ๊ด€์ฐฐํ•˜๋Š” ๊ฒฝ์šฐ "ยฑ50 ๊ด€์ฐฐ์— ๋Œ€ํ•œ ๋กค๋ง ํ‰๊ท "์„ ์ ์šฉํ•˜์—ฌ ํ‰ํ™œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ํ™•์žฅ์€ "๋ถ€๋“œ๋Ÿฌ์šด ์ฐฝ"์„ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์˜ ๊ด€์ฐฐ์ด ๋” ๋ฉ€๋ฆฌ ์žˆ์„์ˆ˜๋ก ๊ธฐ์—ฌ๋„๊ฐ€ ์ ์€ ๊ณผ๊ฑฐ ๊ด€์ฐฐ์— ๋Œ€ํ•œ ํ‰๊ท ์„ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋˜๋Š” ๊ฐ€์šฐ์Šค ์ปค๋„์— ๋Œ€ํ•œ ์ฃผ๋ณ€ ๊ด€์ธก์น˜์˜ ํ‰๊ท ์ž…๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ๋Š” ์ ์‘ํ˜• ์ฐฝ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ตฌ๊ฐ„ [0, 1]์— ๋Œ€ํ•ด ๋…ธ์ด์ฆˆ ์ž…๋ ฅ์ด ์ •์˜๋œ ๊ฒฝ์šฐ ยฑN ์ฐฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ‰ํ™œํ™”ํ•˜๋ฉด ๊ฐ€์žฅ์ž๋ฆฌ ๊ทผ์ฒ˜์— ํŽธํ–ฅ๋œ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํŽธํ–ฅ๋˜์ง€ ์•Š์€ ์ถ”์ •๊ธฐ๋Š” ๊ฐ€์žฅ์ž๋ฆฌ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฐฝ์˜ ๋ชจ์–‘์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฌํ‘œ๋ณธ ํ‰ํ™œํ™”: ์›๋ณธ ๋ฐ์ดํ„ฐ์™€ ๋™์ผํ•œ ์ˆ˜์˜ ๊ด€์ธก์น˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ œํ•œ์ด ๋„ˆ๋ฌด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ถ€ ๊ธฐ๋ณธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋…ธ์ด์ฆˆ ๊ด€์ฐฐ๋กœ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์›๋ž˜ ์ž…๋ ฅ๋ณด๋‹ค ๋” ๊ฑฐ์น ๊ฑฐ๋‚˜ ๋ฏธ์„ธํ•œ ๋ฉ”์‰ฌ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ํ‰ํ™œํ™” ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ์›๋ž˜ ๋ฐ์ดํ„ฐ์˜ ๊ฐ„๊ฒฉ์ด ๋ถˆ๊ทœ์น™ํ•˜์—ฌ ์ผ๋ฐ˜ ๊ทธ๋ฆฌ๋“œ์— ๋‹ค์‹œ ์ƒ˜ํ”Œ๋งํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Jackknife: ๊ฐ ๊ด€์ธก์น˜์— ๋Œ€ํ•ด ํ˜„์žฌ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ด€์ธก์น˜์— ๋Œ€ํ•œ ํ‰๊ท /ํšŒ๊ท€๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • K-ํด๋“œ ๋ถ„ํ• : ๊ฐ ๊ทธ๋ฃน์ด ๊ด€์ธก์น˜์˜ ์ž‘์€ ๋ถ€๋ถ„๋งŒ ์ œ์™ธํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ด…๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์€ ํ™•์žฅ๋œ ๊ทธ๋ฃนํ™” ์—ฐ์‚ฐ์ž๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋กค๋ง ์ฐฝ์€ ์ด ๋ชฉ๋ก์˜ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ทธ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜์—†๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์ „์— ๋กค๋ง ์กฐ์ธ์— ๋Œ€ํ•œ SQL ๊ตฌ๋ฌธ์„ ๋ณธ ์ ์ด ์—†์Œ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กค๋ง ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ฌธ์ œ๋Š” ๋กค๋ง ์กฐ์ธ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ์—ด์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ "OVER" ์—ฐ์‚ฐ์ž๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ์˜ˆ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋˜๋Š” ๋™์ผํ•œ OVER ์ ˆ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ด๋ฉฐ ๋”ฐ๋ผ์„œ ๋‹จ์ผ roll() ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต์ด ์ค„์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์ผํ•œ OVER() ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ GROUP BY ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์กฐํšŒ ํ…Œ์ด๋ธ”์„ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์—์„œ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๊ฐ€ ๋ฌด์—‡์ด๋“  ์ œ๊ณต๋œ ๊ฐ ์ธก์ •๊ฐ’์— ๋Œ€ํ•ด ์ง€์—ญ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด OVER()๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” Microsoft ๋ฌธ์„œ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์กฐ์ ์œผ๋กœ, GROUP BY ๋Œ€์‹  ์ฐฝ ์ง‘๊ณ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง‘๊ณ„๋œ ๊ฐ’๊ณผ ์ง‘๊ณ„๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

data.table์—์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ์—์„œ := ๋ฐ by ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ตฌ๋ฌธ์€ group-by ๊ฒฐ๊ณผ๊ฐ€ ์ง‘๊ณ„๋˜์ง€ ์•Š์€ ๊ฐ’๊ณผ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์—†๋Š” ํ‘œ์ค€ SQL์˜ ์ œํ•œ์„ ์šฐํšŒํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(์ฆ‰, ๋™์ผํ•œ ํ‘œํ˜„์‹์—์„œ A์™€ mean(A)๋ฅผ ๋ชจ๋‘ ์„ ํƒ). ๊ทธ๋Ÿฌ๋‚˜ data.table์—๋Š” ์ด๋Ÿฌํ•œ ์ œํ•œ์ด ์—†์œผ๋ฏ€๋กœ ๊ตฌ๋ฌธ ์„ ํƒ์— ๋” ๋งŽ์€ ์ž์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

SQL์˜ ๋งŽ์€ ์ œํ•œ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ by ์ง‘๊ณ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง‘๊ณ„๋˜๋Š” GROUP BY์˜ ์„ค๊ณ„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ƒˆ ์ฐฝ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฃจ๋ ค๋ฉด ์ƒˆ API๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. FUN() OVER (PARTITION BY ...) ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•ด SQL ์ฐฝ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ทธ๋ฃนํ™”๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ _partition by_๋Š” ๋‹จ์ผ ์ธก์ •์— ๋Œ€ํ•œ ๋กœ์ปฌ ๊ทธ๋ฃนํ™”์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ SQL์˜ ์œ ์—ฐ์„ฑ์„ ์–ป์œผ๋ ค๋ฉด j = mean(V1, roll=5) ๋˜๋Š” j = over(mean(V1), roll=5) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น API๋ฅผ j ์— ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"ยฑ50 ๊ด€์ธก์น˜์— ๋Œ€ํ•œ ๋กค๋ง ํ‰๊ท "์„ ์ ์šฉํ•˜์—ฌ ํ‰ํ™œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด align ์ธ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ํ™•์žฅ์€ "๋ถ€๋“œ๋Ÿฌ์šด ์ฐฝ"์„ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์˜ ๊ด€์ฐฐ์ด ๋” ๋ฉ€๋ฆฌ ์žˆ์„์ˆ˜๋ก ๊ธฐ์—ฌ๋„๊ฐ€ ์ ์€ ๊ณผ๊ฑฐ ๊ด€์ฐฐ์— ๋Œ€ํ•œ ํ‰๊ท ์„ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋˜๋Š” ๊ฐ€์šฐ์Šค ์ปค๋„์— ๋Œ€ํ•œ ์ฃผ๋ณ€ ๊ด€์ธก์น˜์˜ ํ‰๊ท ์ž…๋‹ˆ๋‹ค.

์ด๋™ ํ‰๊ท ์—๋Š” ๋งŽ์€ ๋ณ€ํ˜•(์‚ฌ์‹ค์ƒ ๋ฌด์ œํ•œ)์ด ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ‰ํ™œ ์ฐฝ ํ•จ์ˆ˜(rollmean/SMA ์ œ์™ธ)๋Š” ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท (EMA)์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ์„ ํฌํ•จํ•ด์•ผ ํ•˜๊ณ  ์–ด๋–ค ๊ฒƒ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”์ง€๋Š” ๊ฒฐ์ •ํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๊ธฐ๋Šฅ ์š”์ฒญ์— ๋”ฐ๋ผ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด์™€ ๊ฐ™์€ ์š”์ฒญ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์€ ํ™•์žฅ๋œ ๊ทธ๋ฃนํ™” ์—ฐ์‚ฐ์ž๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋กค๋ง ์ฐฝ์€ ์ด ๋ชฉ๋ก์˜ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๊ทธ๋“ค์€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ SO์™€ ์šฐ๋ฆฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ƒ์„ฑ๋œ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋กค๋ง ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ์ž ์š”์ฒญ์˜ 95% ์ด์ƒ์„ ๋‹ด๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. EMA ๋ฐ ๊ธฐํƒ€ MA์—์„œ ์ž‘์—…ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค(data.table์ด ์ตœ์ ์˜ ์žฅ์†Œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ). ๊ทธ๋Ÿฌ๋‚˜ ๋ณ„๊ฐœ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ํฌํ•จํ•œ ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ 4๋…„ ๋™์•ˆ data.table์—์„œ ๋‹จ์ˆœ ์ด๋™ ํ‰๊ท ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ†ต๊ณ„ํ•™์ž์˜ ๊ด€์ ์—์„œ ๋ณธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ ๊ด€์ ์€ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์ง•(์ตœ์†Œํ•œ ์ผ์ฃผ์ผ์— ํ•œ ๋ฒˆ ์ฐฝ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ ๊ณณ)๊ณผ ๊ฐ€๊ฒฉ ์ถ”์„ธ ๋ถ„์„(์ˆ˜์‹ญ ๊ฐ€์ง€์˜ ์ด๋™ ํ‰๊ท ์„ ์‚ฌ์šฉํ•œ ๊ณณ)์—์„œ ๋‚˜์˜ต๋‹ˆ๋‹ค.

rollmean ์ดˆ์•ˆ์ด roll ๋ถ„๊ธฐ๋กœ ํ‘ธ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋กค๋ง ํ‰๊ท ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋Š” ์ž…๋ ฅ์— ์žˆ๋Š” na.rm=FALSE ๋ฐ NA๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌํ˜„์€ ISNAN ํ˜ธ์ถœ๋กœ ์ธํ•ด ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ถ€๊ณผํ•˜๋Š” mean ์— ๋Œ€ํ•ด ์ผ๊ด€๋˜๊ฒŒ NA๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์— NA๊ฐ€ ์—†๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ API๋ฅผ ๋” ๋น ๋ฅด์ง€๋งŒ ๋œ ์•ˆ์ „ํ•œ ๋ฒ„์ „์œผ๋กœ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ™๋ณด๋Š” #2795์— ์žˆ์Šต๋‹ˆ๋‹ค.

@mattdowle PR์˜ ์งˆ๋ฌธ์— ๋‹ต๋ณ€

์™œ data.table ๋‚ด์—์„œ ์ด๊ฒƒ์„ ํ•ฉ๋‹ˆ๊นŒ? ๊ธฐ์กด ํŒจํ‚ค์ง€์— ๊ธฐ์—ฌํ•˜๊ณ  data.table์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ†ตํ•ฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  1. data.table์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” 3๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๋Ÿฌ SO ์งˆ๋ฌธ์— data.table ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด๊ฒƒ์ด data.table์˜ ๋ฒ”์œ„์— ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
  2. data.table์€ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์— ์™„๋ฒฝํ•˜๊ฒŒ ์ ํ•ฉํ•˜๋ฉฐ ๋กค๋ง ์ง‘๊ณ„๋Š” ๊ฑฐ๊ธฐ์—์„œ ๋งค์šฐ ์œ ์šฉํ•œ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—๋Š” ๊ตฌ๋ฌธ(data.table์— ๋‚ด์žฅ๋œ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ, ์˜ˆ๋ฅผ ๋“ค์–ด [...] ๋‚ด๋ถ€ ๋ฐ ์ตœ์ ํ™”๋จ) ๋ฐ data.table ๋‚ด๋ถ€๋ฅผ C ์ˆ˜์ค€์˜ ๋กค๋ง ํ•จ์ˆ˜์— ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด froll*์€ data.table ์ธ๋ฑ์Šค์™€ ํ‚ค๋ฅผ ์ธ์‹ํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ„๋‹จํ•œ ์งง์€ ์˜ˆ.

๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์€ ์†๋„์™€ ์ข…์†์„ฑ ์ฒด์ธ์˜ ๋ถ€์กฑ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์ฆ˜์—๋Š” ๋‹ฌ์„ฑํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ‚ค/์ธ๋ฑ์Šค๋Š” frollmin/frollmax์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์ธก์ • ๋ณ€์ˆ˜์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ธก์ • ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ๊ณ  ์•„์ง ์ตœ์†Œ/์ตœ๋Œ€์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋กค* ํ˜ธ์ถœ ํ›„์— ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—(๋น„๋กค๋ง ํ‰๊ท , ํ•ฉ๊ณ„ ๋“ฑ๊ณผ ๋ฐ˜๋Œ€) GForce ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์˜๋ฏธ๊ฐ€ ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค.

ํ†ตํ•ฉ์— ๋Œ€ํ•œ ์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ์ด ์—†์œผ๋ฉด ๋Œ€์‹  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ๊ธฐ์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์— ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋‚˜์—ดํ–ˆ๋Š”๋ฐ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์œผ๋ฉด data.table ์‚ฌ์šฉ์ž์—๊ฒŒ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ํŠธ์œ„ํ„ฐ์— ์งˆ๋ฌธํ•˜์—ฌ ์‘๋‹ต์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์˜ค๋žซ๋™์•ˆ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์ด ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sparklyr ๋Š” ๋งค์šฐ ํฐ ๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ๋กค๋ง ๊ธฐ๋Šฅ์„ ๋งค์šฐ ์ž˜ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@harryprince ๋Š”
"์ฐฝ ๊ธฐ๋Šฅ" ์— ๋”ฐ๋ฅด๋ฉด

๋กค๋ง ์ง‘๊ณ„๋Š” ๊ณ ์ • ๋„ˆ๋น„ ์ฐฝ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ R์ด๋‚˜ dplyr์—์„œ๋Š” ์ฐพ์„ ์ˆ˜ ์—†์ง€๋งŒ RcppRoll๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—๋Š” ๋งŽ์€ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

AFAIU dplyr ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ sparklyr๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ง€์ • spark API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š” ์ง‘๊ณ„ ๋กค๋ง์— ๊ด€ํ•œ ๊ฒƒ์œผ๋กœ, ๋‹ค๋ฅธ "์œ ํ˜•"์˜ ์ฐฝ ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์˜ค๋žซ๋™์•ˆ data.table ์— ์žˆ์Šต๋‹ˆ๋‹ค.

(์ธ๋ฉ”๋ชจ๋ฆฌ) ์„ฑ๋Šฅ๊ณผ sparklyr / SparkR ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์งˆ๋ฌธ์ด ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์—ด์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ฐฝ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‹ค์ œ๋กœ ๋” ๋„“์€ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋กค๋ง ๊ธฐ๋Šฅ์—๋งŒ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋™์ผํ•œ ์ฟผ๋ฆฌ ๋‚ด์—์„œ ๋‚ ์งœ๋ณ„, ์ฃผ๋ณ„, ์ฃผ+์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ‰๊ท  ์ œํ’ˆ ๊ฐ€๊ฒฉ์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌป๋Š” ๊ฒƒ์ด ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DT[, .( mean(price, by=date), 
        mean(price, by=week), 
        mean(price, by=c(week, category)) )]

์ด์ œ ์ด ๊ธฐ๋Šฅ์ด ์ด๋ฏธ ๊ตฌํ˜„๋˜์—ˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ๋กค๋ง ์ˆ˜๋‹จ์œผ๋กœ์˜ ๋‹จ์ˆœํ•œ ๋„์•ฝ์ด ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DT[, .( mean(price, roll=5), 
        mean(price, roll=20), 
        mean(price, roll=100) )]

์ด๊ฒƒ์ด rollmean(price, 5) ๋ณด๋‹ค ํ™•์‹คํžˆ ๋‚ซ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ณ ๋ คํ•  ๋ช‡ ๊ฐ€์ง€ ๋Œ€์•ˆ์„ ๋˜์ง€๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค...

@st-pasha

๋‚ ์งœ๋ณ„, ์ฃผ๋ณ„, ์ฃผ+์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ํ‰๊ท  ์ œํ’ˆ ๊ฐ€๊ฒฉ์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ• -- ๋ชจ๋‘ ๋™์ผํ•œ ์ฟผ๋ฆฌ ๋‚ด์—์„œ.

AFAIU ์ด๊ฒƒ์€ ์ด๋ฏธ ?groupingsets ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์•„์ง [.data.table ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@jangorecki , @st-pasha ๋ฐ Co. -- ๋ชจ๋“  ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋ถ€๋ถ„ ์ฐฝ ์ง€์›์ด ๋ฒ”์œ„์—์„œ ์ œ๊ฑฐ๋œ ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ๋กœ๋“œ๋งต์— ๋‹ค์‹œ ํฌํ•จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋•Œ๋•Œ๋กœ ๋‚˜์—๊ฒŒ ์œ ์šฉํ•  ๊ฒƒ์ด๊ณ  ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ zoo ๋˜๋Š” RcppRoll ์— ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ๊ธฐ๋Šฅ ๊ฒฉ์ฐจ๋ฅผ ์ฑ„์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์งˆ๋ฌธ ์€ partial = TRUE ์ธ์ˆ˜์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋กค๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

@msummersgill ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋ถ€๋ถ„ ์ฐฝ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” commit sha๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋งํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ๊ตฌํ˜„์€ ๋‚˜์ค‘์— ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ๋น„์šฉ์„ ๋ถ€๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•„๋งˆ๋„ ๊ทธ๋ž˜์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์™„๋ฃŒํ•œ ๋‹ค์Œ 1:window_size ์˜ ์ถ”๊ฐ€ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„ ์ฐฝ์„ ์ฑ„์šฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ๋ˆˆ์— ๋•๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” adaptive ์ธ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ partial ๊ธฐ๋Šฅ์€ adaptive ๋กค๋ง ํ‰๊ท ์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ?froll manual ์— adaptive ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ partial ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ์—ฌ๊ธฐ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ:

d = as.data.table(list(1:6/2, 3:8/4))
an = function(n, len) c(seq.int(n), rep(n, len-n))
n = an(3, nrow(d))
frollmean(d, n, adaptive=TRUE)

๋ฌผ๋ก  ๋ถ€๋ถ„์ ์ธ ์ฐฝ์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋น„์ ์‘ํ˜• ๋กค๋ง ๊ธฐ๋Šฅ๋งŒํผ ํšจ์œจ์ ์ด์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
AFAIK zoo ์—๋Š” partial ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

data.table์— ๋กค๋ง ํšŒ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@waynelapierre์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋‚ด +1์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์งˆ๋ฌธ ํ•˜๋‚˜๋งŒ. ๋กค๋ง ํ‰๊ท  ๋˜๋Š” ๋กค๋ง ์ค‘์•™๊ฐ’๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ๋กค๋ง ์ง‘๊ณ„๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋กค๋ง DT ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„๊ณผ ๊ฐ™์€ ๋ณด๋‹ค ์ •๊ตํ•œ ๋กค๋ง ๊ธฐ๋Šฅ๋„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งˆ์ง€๋ง‰ 10๊ฐœ์˜ obs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กค๋ง DT๋ฅผ ๋งŒ๋“ค๊ณ  lm ํšŒ๊ท€๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

@randomgambit ๋†’์€ ์ˆ˜์š”๊ฐ€ ์—†๋‹ค๋ฉด ๋ฒ”์œ„ ๋ฐ–์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. C์—์„œ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๊ธฐ๋ณธ R/zoo๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด "์˜จ๋ผ์ธ" ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๊นŒ๋‹ค๋กญ๊ณ  ๊ฒฐ๊ตญ์—๋Š” ๋ชจ๋“  ํ†ต๊ณ„์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์–ด๋Š ์‹œ์ ์—์„œ ํ•ด๋‹น ํ†ต๊ณ„๋ฅผ ์ž˜๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jangorecki ํฅ๋ฏธ๋กœ์šด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, tsibble ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜์—ฌ DATA.TABLES tibble ! ์ •์‹ ์ด ๋ฒˆ์ฉ ๋“ค์—ˆ๋‹ค :D

frollmean ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ x ์˜ ์ตœ๊ทผ์ ‘ ์ด์›ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ง„ y ๋Œ€ํ•ด P[y | x] ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋น„๋ชจ์ˆ˜์  "๋กœ์ง€์Šคํ‹ฑ ๊ณก์„ "์„ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. y ์ €์žฅ๋œ logical ๊ฐ€ integer ์ž๋™ ์บ์ŠคํŒ…๋˜์ง€ ์•Š์•„ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

DT = data.table(x = rnorm(1000), y = runif(1000) > .5)
DT[order(x), .(x, p_y = frollmean(y, 50L))]

froll์˜ ์˜ค๋ฅ˜(fun = "mean", x = x, n = n, ์ฑ„์šฐ๊ธฐ = ์ฑ„์šฐ๊ธฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ = ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ •๋ ฌ = ์ •๋ ฌ, :
x๋Š” ์ˆซ์ž ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฒกํ„ฐํ™”๋œ x / n ์ธ์ˆ˜๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์˜ ์˜ˆ.
https://github.com/AdrianAntico/RemixAutoML/commit/d8370712591323be01d0c66f34a70040e2867636#r34784427
๋ฃจํ”„๊ฐ€ ์ ๊ณ  ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์‰ฝ๊ณ  ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค(10x-36x ์†๋„ ํ–ฅ์ƒ).

frollapply ์ค€๋น„: https://github.com/Rdatatable/data.table/pull/3600

    ### fun             mean     sum  median
    # rollfun          8.815   5.151  60.175
    # zoo::rollapply  34.373  27.837  88.552
    # zoo::roll[fun]   0.215   0.185      NA
    # frollapply       5.404   1.419  56.475
    # froll[fun]       0.003   0.002      NA

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, frollapply์— ์ „๋‹ฌ๋œ FUN(์‚ฌ์šฉ์ž ์ •์˜)์€ R ๊ฐœ์ฒด ๋˜๋Š” data.frame(data.table)์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๊นŒ? frollapply์— ์ „๋‹ฌ๋œ x๋Š” ์ˆซ์ž๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜๋˜์ง€ ์•Š์€ ๋ฌธ์ž์˜ data.table์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ FUN์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ” ๋ฐ frollapply๊ฐ€ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ Benford์˜ ํ…Œ์ŠคํŠธ ๋˜๋Š” ๋ ˆ์ด๋ธ”์— ๋Œ€ํ•œ ์š”์•ฝ๊ณผ ๊ฐ™์€ ๋กค๋ง ํšŒ๊ท€ ๋˜๋Š” ๋กค๋ง ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ... ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋‹น์‹ ์€ ์‹ถ์Šต๋‹ˆ๋‹ค frollapply(dt, 3, FUN) ๊ธธ์ด์˜ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ nrow(dt) ๊ฐ ๋ชฉ๋ก ์š”์†Œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๊ฒฝ์šฐ data.table ์— ์˜ํ•ด ๋ฐ˜ํ™˜ FUN(dt[window]) ?
frollapply(x=dt, n=3, fun=FUN)[[3]] ๋Š” FUN(dt[1:3]) ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
frollapply(x=dt, n=3, FUN=FUN)[[4]] ๋Š” FUN(dt[2:4]) ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ ๋งž์Šต๋‹ˆ๊นŒ? @jerryfuyu0104

ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์— ์ „๋‹ฌ๋œ ์—ฌ๋Ÿฌ ์—ด์„ ์ง€์›ํ•˜์ง€๋งŒ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ถ”๊ฐ€ ์ธ์ˆ˜ multi.var=FALSE ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. true ๋กœ ์„ค์ •ํ•˜๋ฉด x (์ง€๊ธˆ์ฒ˜๋Ÿผ: list(FUN(x[[1]]),FUN(x[[2]])) )๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์ง€๋งŒ ๋ชจ๋“  ์—ด FUN(x) ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ ์ด์ „์˜ ์š”์ฒญ์„ ๋‘ ๋ฒˆ์งธ๋กœ ํ•œ๋‹ค.

๋˜ํ•œ ๋ถ€๋ถ„ ์ฐฝ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด "๋ถ€๋ถ„" ์ธ์ˆ˜๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@eliocamp partial ์ฐฝ์ด ๋ฌด์—‡์ธ์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@eliocamp "๋ถ€๋ถ„์ "์ธ์ˆ˜๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ฒ ์ง€๋งŒ adaptive=TRUE ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ˆ์ œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๊ฒƒ์€ ์ ˆ๋ฐ˜ ์ฐฝ ์ง€์ ์„ ํ˜•์„ฑํ•˜๋Š” ๋Œ€์‹  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ•จ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋„ˆ๋น„๊ฐ€ 11์ธ ๋กค๋ง ํ‰๊ท ์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋Š” ์š”์†Œ 1์—์„œ 6๊นŒ์ง€์˜ ํ‰๊ท ์ด ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์š”์†Œ๋Š” 1์—์„œ 7๊นŒ์ง€์˜ ํ‰๊ท ์ด ๋˜๋Š” ์‹์ž…๋‹ˆ๋‹ค.

@jangorecki ์˜ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํŽธ๋ฆฌํ•จ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์†๋„๋ฅผ ์œ„ํ•ด์„œ๋„ ๋ถ€๋ถ„์ ์ธ ๋…ผ์Ÿ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. adaptive=TRUE ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋„ค, ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋กค๋ง ํšŒ๊ท€๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๊ฐ๊ฐ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•œ ๋ฒˆ์— ๋กค๋งํ•ฉ๋‹ˆ๋‹ค.
์ด๋“ค์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋„์›€์„ ์ฃผ๊ณ  ์‹ถ์ง€๋งŒ ์ œ C++ ๊ธฐ์ˆ ์€ ์ „ํ˜€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :sweat: ์™„์ „ ๋‰ด๋น„๋“ค์—๊ฒŒ ์–ด์šธ๋ฆด ๊ฒƒ ๊ฐ™๋‚˜์š”?

์šฐ๋ฆฌ๋Š” C++๋กœ ์ฝ”๋”ฉํ•˜์ง€ ์•Š์ง€๋งŒ C๋กœ ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋„ค, ์‹œ์ž‘ํ•˜๊ธฐ์— ์ข‹์€ ๊ณณ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” frollmean์—์„œ ์ •ํ™•ํžˆ ๊ทธ๋ ‡๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ๊ฐ€๊ด€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋˜ ๋‹ค๋ฅธ ์š”์ฒญ์— ๋Œ€ํ•ด frollmean(.SD)์ด ์ด๋ฆ„์„ ๋ณด์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ผ๋ฐ˜์ ์œผ๋กœ, froll*์€ ์ž…๋ ฅ์ด ์ด๋ฆ„์ด ์žˆ๋Š” ๋ชฉ๋ก๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์ด๋ฆ„์„ ๋ณด์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

data.table์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ €๋Š” tsibble ํŒจํ‚ค์ง€ ์—์„œ ํ˜„์žฌ ์ œ๊ณต๋˜๋Š” "์‹œ๊ฐ„ ์ธ์‹" ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด ํŒจํ‚ค์ง€๋Š” dplyr ์ฃผ๋ณ€์—์„œ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. data.table ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•œ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํ˜ธ์—์„œ ์ œ์•ˆํ•˜๋Š” ์ฐฝ ๊ธฐ๋Šฅ์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

@ywhcuhcuh ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ์š”๊ตฌํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋Œ€๋ถ€๋ถ„์€ ๋งค์šฐ ๋น ๋ฅธ ์—ฌ์ „ํžˆ ๊ฐ€๋ฒผ์šด ํŒจํ‚ค์ง€ ๋กค๋กœ ์ž˜ ๋ฎ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋Š” ๊ด€์‹ฌ ์žˆ๋Š” ๊ธฐ๋Šฅ๋ณ„๋กœ ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜๋ฏ€๋กœ ๊ตฌํ˜„/์œ ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ณ„๋„๋กœ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. tstibble์˜ readme๋ฅผ ๋ณด๋ฉด ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์ œ๊ณต๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค...
์ œ๋ชฉ์€ "Tidy Temporal Data Frames"์ด์ง€๋งŒ ์ž„์‹œ ์กฐ์ธ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@jangorecki๋‹˜ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ID์™€ ์‹œ๊ฐ„์ด ์žˆ๋Š” "ํŒจ๋„ ๋ฐ์ดํ„ฐ"๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์ด ๋ฐ์ดํ„ฐ ๊ธฐ๋Šฅ์„ "์ธ์‹"ํ•˜๋ฉด ๋งŽ์€ ์ž‘์—…, ํŠนํžˆ ์‹œ๊ณ„์—ด ์ž‘์—…์ด ๋งค์šฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. STATA๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋ฆฌ๋“œ, ์ง€์—ฐ, ์ฑ„์šฐ๊ธฐ ๊ฐ„๊ฒฉ ๋“ฑ๊ณผ ๊ฐ™์€ tsset ๋ฐ xtset ๊ธฐ๋ฐ˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค. data.table์˜ "์ธ๋ฑ์Šค"๊ฐ€ ํ–ฅ์ƒ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๊ทธ๋Ÿฌํ•œ ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ์ž‘์—…์€ shift ๋ฐ by ์™€ ๊ฐ™์€ data.table ํ•จ์ˆ˜์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. data.table์˜ index ๋Š” ํƒ์ƒ‰ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ๋ฌธ์ œ์— ์†ํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์˜ ํ† ๋ก ์—์„œ ์žƒ์ง€ ์•Š๊ณ  ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค ...

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰