从多维函数创建多个变量

时间:2014-09-11 15:32:49

标签: r data.table

我想在=中使用j从给定函数创建多个变量

例如,来自data.table

DT=data.table(id=sample(10,100),v=runif(100))

我想创建

# id  p20  p80
#  1 0.12 0.92
#  2 0.02 0.83

现在,我做

DT[,list(p20=quantile(v,0.20),p80=quantile(v,0.80),by=id]

2 个答案:

答案 0 :(得分:1)

我不知道你问的问题是否可以直接完成。这是另一种选择 - 围绕它编写一个函数 - (这是我的快速和简单的代码,可以给你一个想法)

DT <- data.table(id=sample(10,100,replace=T),v=runif(100))

test <- function(pctls) {
  str <- "mean=mean(v)"
  for(i in pctls) {
     str<- paste(str,",p",i,"=quantile(v,",i/100,")",sep="")
    }
  str <- paste("DT[,list(",str,"), by=id]",sep ="")
  eval(parse(text=str))
}


test(c(10,20,30))
 id      mean        p10        p20        p30
 1:  1 0.3654006 0.04174424 0.05564887 0.13246705
 2:  2 0.3593194 0.07331625 0.09034995 0.09058092   
 3:  3 0.5071105 0.23652298 0.38699917 0.46832168
 4:  4 0.4399384 0.01624399 0.21743962 0.30668150
 5:  5 0.7163586 0.42516997 0.55865925 0.61741287
 6:  6 0.4773865 0.21349738 0.29869525 0.35726233
 7:  7 0.4433606 0.06423671 0.09839058 0.24951293
 8:  8 0.5774145 0.09875137 0.17900887 0.44749030
 9:  9 0.3980907 0.08683772 0.10629176 0.13377076
10: 10 0.5075917 0.18238568 0.28410222 0.39008093

答案 1 :(得分:1)

你可以尝试&#34; listify&#34;结果。类似的东西:

DT[, as.list(quantile(v, c(0.2, 0.8))), by = id] 

如果要重命名新列:

setnames(DT, c("id", paste0("q", c(0.2, 0.8)))