2017-02-13 49 views
0

我想列出组中的唯一ID,其中可以由用户选择分组变量。以下作品:使用data.table中的条件时,下标越界

if(useGroupVar1){ 

    dt[,unique(id),.(group1a,group1b,group1c)] 

} else { 

    dt[,unique(id),group2] 

} 

我在我的代码中用来过滤行的表达式实际上相当长,所以我想避免重复代码。我想出了这个“解决方案”,这实际上并没有正常工作:

dt[,unique(id),if(useGroupVar1){.(group1a,group1b,group1c)}else{group2}] 

如果条件导致单独使用group2,它的工作原理(虽然列名为if),而是试图得到它使用.(group1a,group1b,group1c)

eval(expr,envir,enclos)中的错误:找不到函数“。”现在

,我读.()是一个别名list(),所以采用后者让我在bysubl [JJ + 1L]这个

错误:下标越界

有没有办法在不复制整个表达式的情况下实现条件by

+1

你有尝试一个正常的字符向量(引用)? –

+0

我会做到这一点:'by = if(useGroupVar1)paste0('group1',c('a','b','c'))else'group2')' – MichaelChirico

+0

这样做,并得到这个非常描述性的错误! '[.data.table'错误'(tabla,if(identical(codificacion [[1]] [i] $ codCIE,: 'by')似乎评估为列名,但不是c()或如果可以,则使用by = list(...)否则,通过= eval(if(!porEESS){c(“cod_dpto”,“cod_prov”,“cod_dist”)} else {cod_2000})应该工作,这是为了提高效率,所以data.table可以检测到需要哪些列。' – zipzapboing

回答

4

只是个人喜好,但我不喜欢在data.table的一个by=语句中粘贴字符串(对我来说不太可读)。相反,我会使用用户选择的变量(var)并创建一个分组变量列表。然后,您可以轻松地选择变量,像这样:

groupVars <- list(
    GroupVar1 = c("group1a","group1b","group1c"), 
    GroupVar2 = c("groupXYZ", "groupABC"), 
    GroupVarX = "group2" 
) 

# user selects that - for example - var = "GroupVar2" 

dt[, unique(id), by = groupVars[[var]]] 

作为一个方面说明:

您可以轻松地扩展这种变量选择了其中一个允许用户选择多套的情况下,分组变量。在这种情况下,你可以把它如下:

假设,即用户选择的变量是现在:

var <- c("GroupVar1", "GroupVarX") # two groups selected 

然后,by=声明变成:

dt[, unique(id), by = unlist(groupVars[var], use.names=FALSE)] 
+0

我甚至会使用'switch' _a la_'groupVars = switch(var,GroupVar1 = ...)' – MichaelChirico

+0

最后一行可以是'unique(dt [,c(groupVars [[var]],“id”)] )',我想。 – Frank

+1

@Frank,真的,但这是一个更具体的情况,而我的答案应该是data.table通用的= statement –