【问题标题】:Removing multiple columns from R data.table with parameter for columns to remove使用要删除的列的参数从 R data.table 中删除多列
【发布时间】:2014-08-26 17:45:47
【问题描述】:

我正在尝试以类似的方式操作多个 data.tables,并想编写一个函数来完成此操作。我想传入一个参数,其中包含将执行操作的列列表。当列的向量声明位于 := 运算符的左侧时,这可以正常工作,但如果它是较早声明的(或传递给函数)则不行。以下代码显示了问题。

dt = data.table(a = letters, b = 1:2, c=1:13)
colsToDelete = c('b', 'c')
dt[,colsToDelete := NULL] # doesn't work but I don't understand why not.
dt[,c('b', 'c') := NULL] # works fine, but doesn't allow passing in of columns

错误是“添加新列 'colsToDelete' 然后分配 NULL(删除它)。”很明显,它将“colsToDelete”解释为一个新的列名。

按照这些思路进行操作时会出现同样的问题

dt[, colNames := lapply(.SD, adjustValue, y=factor), .SDcols = colNames]

我是 R 新手,但对其他一些语言更有经验,所以这可能是一个愚蠢的问题。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这基本上是因为我们允许:= 的 LHS 上的符号添加新列,为方便起见:例如:DT[, col := val]。因此,为了区分 col 本身是名称与存储在 col 中的任何内容作为列名,我们检查 LHS 是 name 还是 expression

    如果是name,它会在 LHS 上添加具有相同名称的列,如果是 expression,则对其进行评估。

    DT[, col := val] # col is the column name.
    
    DT[, (col) := val]  # col gets evaluated and replaced with its value
    DT[, c(col) := val] # same as above
    

    首选成语是:dt[, (colsToDelete) := NULL]

    HTH

    【讨论】:

      【解决方案2】:

      我很惊讶没有使用 set() 函数提供答案。

      set(DT, , colsToDelete, NULL)
      

      这应该是最简单的。

      【讨论】:

      • 连续两个逗号?
      • @wolfsatthedoor 空参数是i 参数,它指的是行。由于省略,表示要更新所有行。
      【解决方案3】:

      要扩展上一个答案,您可以通过引用删除列:

      # delete columns 10 to 15
      dt[ , (10:15) := NULL ]
      

      # delete columns 3, 5 and 10 to 15
      dt[ , (c(3,5,10:15)) := NULL ]
      

      【讨论】:

      • 添加这个,你也可以做 dt[ , -(10:15) ] 或 dt[ , -c(3,5,10:15)]
      【解决方案4】:

      这段代码为我完成了这项工作。您需要拥有要删除的列的位置,例如posvec,如?set中所述

      j:要赋值的列名(字符)或数字(整数) 当列已经存在时,只有列名 被创建。

      DT_removed_slected_col = set(DT, j = posvec, value = NULL)
      

      另外,如果你想获得posvec,你可以试试这个:

      selected_col = c('col_a','col_b',...)
      
      selected_col = unlist(sapply(selected_col, function(x) grep(x,names(DT)))) 
      
      namvec = names(selected_col) #col names
      
      posvec = unname(selected_col) #col positions
      
      

      【讨论】:

        猜你喜欢
        • 2012-05-21
        • 2015-07-07
        • 1970-01-01
        • 2021-03-06
        • 2017-10-21
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        相关资源
        最近更新 更多