我使用以下习语有条件地从a中选择列 data.frame:
DF = data.frame(a = 1:3,b = letters[1:3],c = LETTERS[1:3])
someCondition <- FALSE
# use `if(someCondition)` to conditionally include column 'c'
DF[,c('a','b',if(someCondition)'c')]
:> a b
:> 1 1 a
:> 2 2 b
:> 3 3 c
但等效不适用于data.table的b / c NULL值不会被删除 来自列表的方式与从串联中删除的方式相同:
DT = as.data.table(DF)
DT[,.(a,b,if(someCondition)c)]
:> Error in setnames(jval, jvnames) :
:> Can't assign 3 names to a 2 column data.table
我已经定义了一个名为..
的函数,这是一个解决方法:
.. <- function(...){
x = list(...)
x= x[!sapply(x,is.null)]
x
}
DT[,..(a,b,if(someCondition)c)]
:> V1 V2
:> 1: 1 a
:> 2: 2 b
:> 3: 3 c
但它寻求一种kludgy,必须包括我自己的功能来完成一个如此常见的操作。是否有更惯用的方式从data.table中有条件地选择列?
答案 0 :(得分:4)
我认为.SDcols
参数符合你的要求。在上面的data.table DF示例中,
DF[, .SD, .SDcols= c("a","b", if(someCondition) "c")]
将以与data.frame相同的方式执行操作。您也可以按照以下示例实现此功能。
DF[, .SD, .SDcols=if(someCondition) c("a","b","c") else c("a","b")]
将执行所需的选择。在前一行中,您可以设置更精细的真假向量构造(这可能会破坏保持事物简洁的目的)。