有条件地添加data.table中的列

有条件地添加data.table中的列

问题描述:

我想计算一些统计数据并将结果作为另一个data.table返回。我可以使用以下方法来做到这一点。有条件地添加data.table中的列

DT <- data.table::data.table(station = rep(1:1,52560), mod = rnorm(1*52560),obs = rnorm(1*52560)) # 1year , 1 station 

stat <- DT[,.(minObs  = min(obs), 
      minMod  = min(mod), 
      maxObs  = max(obs), 
      maxMod  = max(mod), 
      meanObs  = mean(obs)] 

但是,我的问题是,我想要有条件地添加这些统计。例如,只有在requestedStats的向量中存在meanObs时, 才会添加列meanObs。原因是我正在计算相当多的统计数据,而且长度很大,我想给用户选择统计数据。我怎样才能做到这一点?假设

requestedStats = c("maxObs","meanObs") 

只是按要求添加。我想避免计算所有的统计数据。只有要求的应该被退回。

+1

这是一个选项来计算所有统计数据,但只返回向量中的那些? –

+0

@newbie你应该编辑你的帖子以反映你对答案的提问。 – Frank

为了避免预先计算所有统计数据,您需要将每个可能命名的统计数据放入列表中。该列表必须被引用,以便R不会在需要之前对其进行评估。

my_exprs = quote(list(
    minObs  = min(obs), 
    minMod  = min(mod), 
    maxObs  = max(obs), 
    maxMod  = max(mod), 
    meanObs  = mean(obs) 
)) 

w = which(names(my_exprs) %in% requestedStats) 
DT[, eval(my_exprs[c(1,w)])] 
#  maxObs  meanObs 
# 1: 4.51951 0.0009352312 
+1

这是一个不错的解决方案 –

+1

谢谢,这正是我需要的。 – newbie