2015-12-19 132 views
1

data.table中以编程方式删除列的最佳做法是什么?data.table - 以编程方式删除列

以下工作:

DT[, c("a", "b") := NULL] 

但是,试图使用存储列名

cols.to.del <- c("a", "b") 
DT[, cols.to.del := NULL] 

它没有严重的cols.to.del没有在正确的环境评估的一个变量来做到这一点的时候。

回答

4

我们可以把它包在括号内,然后分配(:=)到“NULL”(首选方式)

DT[, (cols.to.del) := NULL] 

还是其他选项(如果我们不想用括号把它包起来)将循环遍历for循环的“cols.to.del”,并指定为NULL

for(j in seq_along(cols.to.del)){ 
    DT[, cols.to.del[j] := NULL] 
} 

或为子集划分列,我们可以用setdiff与一起。

DT[, setdiff(names(DT), cols.to.del), with=FALSE] 
+1

第三个版本绝对是我的最爱。谢谢! – paljenczy

+5

@paljenczy请注意,第三个版本不会从'DT'删除列;而是该命令的输出是_new_'data.table',您必须_assign_(通过复制)到'DT',这可能是低效的。 – MichaelChirico

+1

@MichaelChirico指出,谢谢! – paljenczy