我想在组中列出唯一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
而不重复整个表达式?
答案 0 :(得分:5)
只是个人偏好,但我不喜欢在data {表的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)]