Data.table: dcast.data.table eval(fun.aggragate) -- ๋‚ด๋ถ€ ์ง‘๊ณ„ ํ•จ์ˆ˜ ์„ ์–ธ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ๋˜๋ฉด ์‹คํŒจ

์— ๋งŒ๋“  2015๋…„ 10์›” 02์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Rdatatable/data.table

๋ฌธ์ œ #713์„ ์ฐธ์กฐํ•˜๋ฉด ๋ฐฉ๊ธˆ ๊ด€๋ จ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด ์ปดํ“จํ„ฐ์—์„œ dcast.data.table์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ง‘๊ณ„ ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ ์ „๋‹ฌ ์‹คํŒจ

R ๋ฒ„์ „ 3.2.2(2015-08-14)
ํ”Œ๋žซํผ: x86_64-apple-darwin13.4.0(64๋น„ํŠธ)
์‹คํ–‰: OS X 10.10.2(์š”์„ธ๋ฏธํ‹ฐ)
data.table_1.9.6

๋‹ค์Œ์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")

#test dcast.data.table within function with internally declared aggregate fun -> FAILS

  test_dcast_dt2 <- function(data) {
    testfunc2 <- function(x) {
      sum(x)
    }
    data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=testfunc2)
  } 

  res2=test_dcast_dt2(testdata)

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

์ „๋‹ฌ๋œ func์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ํ•ญ์ƒ "fun.aggregate"์ธ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ #713์ด ์ˆ˜์ •๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ์ด์ „ ์˜ˆ์ œ์™€ ๋Œ€์กฐ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")

  test_dcast_dt <- function(data, fun.aggregate) {
    data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=fun.aggregate)
  } 

  custom_sum <- function(x) {
    sum(x)
  }

  res=test_dcast_dt(testdata, custom_sum)

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

์ด ๊ฒฝ์šฐ๋„ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค.

testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")

  test_dcast_dt <- function(data, aggfunc) {
    data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=aggfunc)
  } 

  custom_sum <- function(x) {
    sum(x)
  }

  res=test_dcast_dt(testdata, custom_sum)

์ „๋‹ฌ๋œ func์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ํ•ญ์ƒ "fun.aggregate"์ธ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ #713์ด ์ˆ˜์ •๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ์ด์ „ ์˜ˆ์ œ์™€ ๋Œ€์กฐ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")

  test_dcast_dt <- function(data, fun.aggregate) {
    data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=fun.aggregate)
  } 

  custom_sum <- function(x) {
    sum(x)
  }

  res=test_dcast_dt(testdata, custom_sum)

์ด ๋ฒ„๊ทธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋™์ผํ•œ ๋ฌธ์ œ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. dcast๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ํ•จ์ˆ˜ ๋‚ด์—์„œ fun.aggregate๋ฅผ ์ •์˜ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ:

wrapper <- function() {
  f <- function(x) list(x)
  dcast(data, y ~ x + b, fun.aggragate = f)
}

ํŠน์ • sys.call ํ™˜๊ฒฝ์„ ๋Œ€์ƒ์œผ๋กœ get()์„ ์‚ฌ์šฉํ•˜์—ฌ f๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ f๋ฅผ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์—์„œ new.env()์— ์ฒจ๋ถ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ "d0rg0ld๊ฐ€ 2015๋…„ 10์›” 2์ผ์— ๋Œ“๊ธ€์„ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค" ๋Œ“๊ธ€์ด ํ˜„์žฌ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ?

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