首页 文章

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

提问于
浏览
0

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

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 回答

  • 5

    只是个人偏好,但我不喜欢在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]]]
    

    As a side note:

    在允许用户选择多组分组变量的情况下,您可以轻松扩展此类变量选择 . 在这种情况下,你可以这样:

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

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

    然后, by= 语句变为:

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

相关问题