【问题标题】:Subscript out of bounds when using conditional by in data.table在 data.table 中使用条件 by 时下标越界
【发布时间】:2017-02-13 14:58:53
【问题描述】:

我想列出组内的唯一 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

【问题讨论】:

  • 你试过用普通字符向量(引用)吗?
  • 我会这样做:by = if (useGroupVar1) paste0('group1', c('a','b','c')) else 'group2')
  • 这样做并得到了这个非常描述性的错误! Error in `[.data.table`(tabla, if (identical(codificacion[[1]][i]$codCIE, : 'by' appears to evaluate to column names but isn't c() or key(). Use by=list(...) if you can. Otherwise, by=eval(if (!porEESS) { c("cod_dpto", "cod_prov", "cod_dist")} else { cod_2000}) should work. This is for efficiency so data.table can detect which columns are needed.
  • 或者只是在您的[ 电话上方添加一行:group_var = if (...) else 。然后dt[ , , by = group_var].
  • 我明白了。那么是的,我的第二条评论应该有效。

标签: r data.table


【解决方案1】:

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

【讨论】:

  • 我什至会使用switch a la groupVars = switch(var, GroupVar1 = ...)
  • 我猜最后一行可以是unique(dt[, c(groupVars[[var]], "id")])
  • @Frank,是的,但这是一个更具体的情况,而我的回答应该是对 data.table by= 语句的一般性回答
  • 附注一下,候选 groupVars 可能会有一些重叠,所以可能是 Reduce(union, groupVars[var]) 或类似的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多