成语用于有条件地从data.table中选择列

时间:2015-10-26 17:42:49

标签: r data.table

我使用以下习语有条件地从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中有条件地选择列?

1 个答案:

答案 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")]

将执行所需的选择。在前一行中,您可以设置更精细的真假向量构造(这可能会破坏保持事物简洁的目的)。