有条件地在data.table上有效地定义新列

时间:2014-08-11 10:47:48

标签: r data.table

我有大量的data.table,有600万行。

示例数据是:

DT:

VAR1 VAR2 VAR3.....
6           5
NA    5     1
"?"   2     0

我想重新定义两列。 我使用下面的代码,它的工作非常慢。

DT=DT[,':='(VAR1=ifelse(DT$VAR1 == "?" | is.na(DT$VAR1) |  is.null(DT$VAR1) | 
                  length(DT$VAR1) == 0 ,  1 , DT$VAR1),
            VAR2 = ifelse ( DT$VAR2 == "?" | is.na(DT$VAR2) |  
                  is.null(DT$VAR2) | length(DT$VAR2) == 0, "" , DT$VAR2)) ,with=FALSE]

有没有办法可以修改代码,以便更快地运行?

1 个答案:

答案 0 :(得分:2)

我不确定你到底想要做什么,但是你在如何操作data.table对象时遇到了几个基本错误:

  1. 无需DT=DT作为:=更新DT参考
  2. 执行DT无需在data.table对象范围内引用DT$VAR1,而只需执行VAR1
  3. ifelse非常低效且缓慢(尽管被矢量化)所以总是尽量避免它(特别是嵌入ifelse)。在您的情况下,我怀疑您尝试使用1中的VAR1""中的VAR2来替换不是数字的所有内容,对吗?如果是这样,您只能查找数值,因此,请避免使用ifelse语句
  4. 尝试

    DT[!grepl("\\d", VAR1), VAR1 := "1"]
    DT[!grepl("\\d", VAR2), VAR2 := ""]
    

    将返回(对于您的示例数据集)

    DT
    #    VAR1 VAR2 VAR3
    # 1:    6         5
    # 2:    1    5    1
    # 3:    1    2    0