【问题标题】:Replacing occurrences of a number in specific columns from a data table替换数据表中特定列中出现的数字
【发布时间】:2017-11-05 07:18:24
【问题描述】:

我遇到了this 帖子,内容是如何替换 数据框所有 列中出现的数字(例如,将所有 4 全部替换为 10列):DF[DF == 4] <- 10。使用数据表可以以完全相同的方式获得相同的结果:DT[DT == 4] <- 10

但是,如果我想将此修改应用于数据表中的特定列,无论这些列是按位置(例如2:4)还是按名称(例如c("V2", "V3", "V4"))?

我更喜欢“优雅”的解决方案,而不是对每一列进行迭代。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以使用set,这样会更有效率

    for(j in 2:4) {
      set(DT, i = which(DT[[j]]==4), j=j, value = 10)
     }
    DT
    #   V1 V2 V3 V4
    #1:  A  2  2 10
    #2:  B  1 10 10
    #3:  C  3 10  3
    #4:  D  3  2 10
    #5:  E  3  3  3
    #6:  F 10  3  3
    

    上面的也可以用列名来完成

    for(j in names(DT)[2:4]){
       set(DT, i = which(DT[[j]]==4), j=j, value = 10)
     }
    

    或者另一种选择是使用感兴趣的列(数字索引或列名)指定.SDcols,循环遍历Data.table 的子集(.SD),replace 的值是4 到 10 并将 (:=) 输出分配回感兴趣的列

    DT[, (2:4) := lapply(.SD, function(x) replace(x, x==4, 10)), .SDcols = 2:4]
    

    或使用列名

    DT[, (names(DT)[2:4]) := lapply(.SD, function(x) replace(x, x==4, 10)), 
          .SDcols = names(DT)[2:4]]
    

    数据

    set.seed(24)
    DT <- data.table(V1 = LETTERS[1:6], V2 = sample(1:4, 6, replace = TRUE), 
       V3 = sample(2:4, 6, replace = TRUE), V4 = sample(3:4, 6, replace= TRUE))
    

    【讨论】:

    • 这很完美!我只是建议您再添加一行代码,但使用列名让每个人都清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多