์ ์ถ์ : Matt Weller; ํ ๋น ๋์ : ์๋ฌด๋; R-Forge ๋งํฌ
.SDcols
์ฌ์ฉํ ๋ (์ฌ๋ฌ ์ด์ ํจ์๋ฅผ ์ ์ฉํ๊ธฐ ์ํด) ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์๋ ํ
์ด๋ธ (v1)์ ๋ค๋ฅธ ์ด์ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp, :
# object 'v1' not found
๋ชฉ๋ก ๋์ c๋ฅผ ์ฌ์ฉํ ๋ ๋น์ทํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ถ๋ช
ํ j
์ ๋ด์์ v1 ์ด์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด lapply
๋ถ๋ถ์ ํฌํจ๋๋ ๊ฒ์ ์ํ์ง ์์ง๋ง ๊ณ์ฐ ํ์ ๊ทธ๊ฒ์ ์ญ์ ํด์ผํ์ง๋ง, ์ด v1์ ํฌํจํ๋ ๋ค์ ์ฝ๋์ ์์งํ์ต๋๋ค.
sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
Stackoverflow์ eddi์ ๋ฐ๋ฅด๋ฉด ์ด๊ฒ์ ๋ฒ๊ทธ์ด๋ฉฐ ๊ทธ๋ ๋์๊ฒ๋ณด๊ณ ํ๋๋ก ์์ฒญํ์ต๋๋ค. ๋๋ ๊ทธ๊ฐ ๋ฒ๊ทธ๋ผ๊ณ ์๊ฐํ๋ ๋ถ๋ถ์ด ์ ํํ ํ์คํ์ง ์๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋ ์์ธํ ๋ด์ฉ์ ์ ๊ณต ํ ์ ์์ต๋๋ค. Arun์ด ๋ฐ์ ๋ค์ธ ๋ต๋ณ์ ์ดํด๋ณด๋ฉด ๋ฌธ์ ๊ฐ ์ด๋์ ์๋์ง ๊ฐ์กฐ ํ ๊ฒ์ ๋๋ค.
๋ค์ ์ ๊ด๋ จ SO ๊ฒ์๋ฌผ์ ๋๋ค.
์ ๋ฐ์ดํธ ํ ๋ค๋ฅธ ๊ฒ์๋ฌผ : http://stackoverflow.com/questions/27755518/data-table-sd-lapply-multiple-columns-in-argument
ํ๋ฐ ๋นํธ,ํ์ง๋ง ์ถ๊ฐ ์ด ๋๋ฏธ์ ๋ด ์ง๋ฌธ์
๋ฒ๊ทธ๋ผ๊ณ ์๊ฐํ์ง๋ ์์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก .SDcols
์ถ๊ฐ ํ์ ํ๋๋ฅผ ์ ๊ณตํ๊ณ ๋์ค์ j
์์น ์๋ ์ด์ ์ ์ธํ๊ธฐ ์ํด .SD[, !"total", with=FALSE]
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๊ฒ์ ๋ ๋ค๋ฅธ ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๋ค. dt$total
์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๊ถ๊ธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, ์ด๋ฐ ์ข
๋ฅ์ ๊ฒ์ FR๊ณผ ๋ฒ๊ทธ, IMO ์ฌ์ด์ ๊ฒฝ๊ณ๋ฅผ ์ถค์ถ๊ณ ์์ต๋๋ค.
๋ค์ ๋ถํ๋ ค. ์ด๊ฒ์ ๋งค์ฐ ์ค์ํ ์์ ์ฌํญ์ด ๋ ์ ์์ต๋๋ค. ์ด ์ง๋ฌธ ์ DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]
์ (๊ณผ) ๊ด๋ จ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ์ ์ฌ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์ ์ฉํ ๋ ๋ค๋ฅธ ๊ฐ๋จํ ๊ฒฝ์ฐ์ ๋๋ค. http://stackoverflow.com/a/32498711/1191259
๊ณ ํต๋ฐ๋ ๋ ๋ค๋ฅธ ๊ฐ๋จํ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. http://stackoverflow.com/questions/32944060/using-data-table-to-calculate-new-columns/32944519#32944519
์์ ์ ์ ๋ฐ์ดํธ ํ ๋ค๋ฅธ ํญ๋ชฉ : http://stackoverflow.com/q/32915770/1191259
์์ด! ์ด์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
require(data.table)
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# grp v1 v2 v3
# 1: 2 7 4.5 12.5
# 2: 3 12 4.0 13.0
# 3: 1 9 3.5 13.5
์ฌ๊ธฐ์ ๋งํฌ ๋ ๋ชจ๋ SO ๊ฒ์๋ฌผ์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๋ชจ๋์๊ฒ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค, @arunsrinivasan. ๋๋์ด ์์ ์ ๋ช ๋ ๋์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์๋ค.
๋๋ฐ! ๊ฐ์ฌํฉ๋๋ค