2014-09-11 5 views
0

Я хотел бы использовать = в 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] 

ответ

1

Вы можете попробовать «listify» результатов. Что-то вроде:

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

Если хотите переименовать новые столбцы:

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

Я не знаю, может ли то, что вы просите, сделать напрямую. Вот альтернатива - написать функцию вокруг IT- (это мой быстрый & грязный код, чтобы дать вам идею)

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 
+0

Спасибо! Однако одна из причин, по которой я ищу такой синтаксис, заключается в том, что вызов однажды 'quantile (v, c (0.2, 0, 8))' должен быть более эффективным, чем вызов последовательно 'quantile (v, 0.2)', а затем ' quantile (v, 0.8) ', no? – Matthew

+0

Вы, вероятно, правы, но, безусловно, есть счет за то, что вы запрашиваете больше квантилей сразу - т.е. system.time (quantile (v, c (0.2, 0.8)) больше, чем system.time (quantile (v, c (0.2)) dat <- rpois (1e7, 10) system.time (quantile (dat, c (0.2,0.8))) [3] -система.time (quantile (dat, c (0.2))) [3] - system.time (quantile (dat, c (0.2))) [3] – 6th

Смежные вопросы