在data.table中使用条件by时下标超出范围

zip*_*ing 0 r data.table

我想列出组内的唯一ID,用户可以在其中选择分组变量。以下作品:

if(useGroupVar1){

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

} else {

  dt[,unique(id),group2]

}
Run Code Online (Sandbox Code Playgroud)

我在代码中用于过滤行的表达式实际上很长,因此我想避免重复代码。我想出了这个“解决方案”,该解决方案实际上不起作用:

dt[,unique(id),if(useGroupVar1){.(group1a,group1b,group1c)}else{group2}]
Run Code Online (Sandbox Code Playgroud)

如果条件导致group2单独使用,则该方法有效(尽管该列称为if),但尝试使其在.(group1a,group1b,group1c)结果中使用

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

现在,我读到的.()是的别名list(),因此使用后者可以得到

bysubl [[jj + 1L]]错误:下标超出范围

有没有一种方法可以实现条件by而不复制整个表达式?

tal*_*lat 5

只是个人喜好,但我不喜欢将字符串粘贴by=到data.table 的语句中(我不太可读)。

相反,我将使用用户选择的变量(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]]]
Run Code Online (Sandbox Code Playgroud)

附带说明:

对于允许用户选择多组分组变量的情况,您可以轻松扩展这种变量选择。在这种情况下,您可以按以下方式进行操作:

假设用户选择的变量现在为:

var <- c("GroupVar1", "GroupVarX") # two groups selected
Run Code Online (Sandbox Code Playgroud)

然后,该by=语句变为:

dt[, unique(id), by = unlist(groupVars[var], use.names=FALSE)]
Run Code Online (Sandbox Code Playgroud)