【问题标题】:dynamically subseting data.table in R在R中动态子集data.table
【发布时间】:2020-10-12 19:49:52
【问题描述】:

我的 data.table 包含名为 claimsK 列,以及其他 30 列。我想对data.table 进行子集化,以便只保留没有 0 个声明的行。

所以,首先我得到过滤所需的所有列名。出于本示例的目的,我选择了K = 2

> claimsCols = c("claimsnext", paste0("claims" , 1:K))
> claimsCols
[1] "claimsnext" "claims1"    "claims2" 

我尝试过像这样的子集:

for(i in claimsCols){
  BTplan <- BTplan[ claimsCols[i] == 0, ]
  i+1
}

这确实有效:

Error in i + 1 : non-numeric argument to binary operator

我确定有更好的方法来做到这一点?

【问题讨论】:

    标签: r loops data.table


    【解决方案1】:

    我基本上会做 akrun 做的事情

    idx = BTplan[ , Reduce(`&`, .SD), .SDcols = patterns('claims')]
    BTplan = BTplan[idx]
    

    创新是:

    1. .SDcols 中使用patterns 指定要按模式包含的列
    2. &amp; 自动将数字转换为逻辑,即1.1 &amp; 2.2TRUE,一旦任何地方有0,就会变成FALSE(因此过滤相应的行)

    data.table 的未来版本中,这将更加高效和简洁(希望更具可读性):

    idx = BTplan[ , pall(.SD), .SDcols = patterns('claims')]
    BTplan = BTplan[idx]
    

    密切关注此拉取请求:

    https://github.com/Rdatatable/data.table/pull/4448

    【讨论】:

      【解决方案2】:

      在 OP 的代码中,i 是 'claimsCols' 的每个元素,即 character,因此 i +1 不起作用,实际上,它不需要

      for(colnm in claimsCols) {
            BTplan <- BTplan[BTplan[[colnm]] != 0,]
       }
      

      或者使用data.table语法

      library(data.table)
      setDT(BTplan)
      BTplan[BTplan[, Reduce(`&`, lapply(.SD, `!=`, 0)),.SDcols = claimsCols]]
      

      【讨论】:

      • 我尝试了data.table 语法,但收到错误Error in [.data.frame(BTplan, , Reduce(&, lapply(.SD, !=, 0)), .SDcols = claimsCols) : unused argument (.SDcols = claimsCols)
      • @Nneka 看起来您的数据集是data.frame。使用setDT(BTplan) 转换为dat.atable,它应该可以工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多