【问题标题】:R data.table multi column coversion by names [duplicate]R data.table多列按名称覆盖[重复]
【发布时间】:2015-10-20 04:04:20
【问题描述】:

设DT为data.table:

DT<-data.table(V1=factor(1:10),
           V2=factor(1:10),
           ...
           V9=factor(1:10),)

有没有更好/更简单的方法来做这样的多列因子转换:

DT[,`:=`(
  Vn1=as.numeric(V1),
  Vn2=as.numeric(V2),
  Vn3=as.numeric(V3),
  Vn4=as.numeric(V4),
  Vn5=as.numeric(V5),
  Vn6=as.numeric(V6),
  Vn7=as.numeric(V7),
  Vn8=as.numeric(V8),
  Vn9=as.numeric(V9)
)]

列名完全是任意的。

【问题讨论】:

    标签: r type-conversion data.table multiple-columns


    【解决方案1】:

    是的,最有效的可能是在 for 循环中运行 set

    设置要修改的列(您也可以使用names(DT) 来选择所有名称)

    cols <- c("V1", "V2", "V3") 
    

    然后运行循环

    for (j in cols) set(DT, i = NULL, j = j, value = as.numeric(DT[[j]]))
    

    或者效率稍低但更易读的方式只是(注意 cols 周围的括号评估变量)

    ## if you chose all the names in DT, you don't need to specify the `.SDcols` parameter
    DT[, (cols) := lapply(.SD, as.numeric), .SDcols = cols] 
    

    即使对于大数据集,两者都应该是有效的。你可以阅读更多关于data.table基础知识here


    虽然谨防以这种方式将factors 转换为numeric 类,请参阅here 了解更多详情

    【讨论】:

    • 非常感谢,就是这样。尤其是第二种方式。我更喜欢使用名称而不是索引。
    • 您可以在这两个选项中使用名称,请参阅我的编辑。
    猜你喜欢
    • 2020-07-08
    • 2021-09-29
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多