【问题标题】:Remove rows conditionally from a data.table in R从 R 中的 data.table 有条件地删除行
【发布时间】:2014-05-04 12:06:54
【问题描述】:

我有一个带有字段 {id, menuitem, amount} 的 data.table。

这是交易数据 - 因此,id 是唯一的,但 menuitem 会重复。现在,我想删除 menuitem == 'coffee' 的所有条目。

另外,想删除amount <= 0的所有行;

在 data.table 中执行此操作的正确方法是什么?

我可以使用data$menuitem!='coffee',然后将 int 索引到 data[] - 但这不一定有效,也没有利用 data.table。

感谢任何指向正确方向的指针。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    在这种情况下,它与data.frame 没有太大区别

    data <- data[ menuitem != 'coffee' | amount > 0] 
    

    通过引用删除/添加行将被实现。你可以在this question找到更多信息

    关于速度:

    1 您可以通过执行以下操作从密钥中受益:

    setkey(data, menuitem)
    data <- data[!"coffee"]
    

    这将比data &lt;- data[ menuitem != 'coffee'] 更快。但是,要应用您在问题中提出的相同过滤器,您需要滚动加入(我已经完成了午休,我可以稍后添加一些东西:-))。

    2 即使没有键 data.table 对于相对较大的表来说也更快(对于少数行的速度相似)

    dt<-data.table(id=sample(letters,1000000,T),var=rnorm(1000000))
    df<-data.frame(id=sample(letters,1000000,T),var=rnorm(1000000))
    library(microbenchmark)
    > microbenchmark(dt[ id == "a"], df[ df$id == "a",])
    Unit: milliseconds
                   expr       min        lq    median        uq       max neval
          dt[id == "a"]  24.42193  25.74296  26.00996  26.35778  27.36355   100
     df[df$id == "a", ] 138.17500 146.46729 147.38646 149.06766 154.10051   100
    

    【讨论】:

    • 谢谢。只是出于好奇,在这种情况下,它是否利用键来执行比较 menuitem != 'coffee' | amount &gt; 0 比典型的 data.frame 更快?
    • @GopalakrishnaPalem 请在答案中查看编辑
    • 非常感谢米歇尔。另外,microbenchmark 命令很有用,感谢发布。
    • 好的,我发现还没有实现stackoverflow.com/questions/10790204/…
    • ^ 问题 + 解释:github.com/Rdatatable/data.table/issues/2890 对于大 N 应该更快
    【解决方案2】:

    试试这个:

    data <- data[ !(menuitem == 'coffee' | amount <= 0),] 
    

    一般:

    dt <- data.table(a=c(1,1,1,2,2,2,3,3,3),b=c(4,2,3,1,5,3,4,7,6))
    dt
    #>    a b
    #> 1: 1 4
    #> 2: 1 2
    #> 3: 1 3
    #> 4: 2 1
    #> 5: 2 5
    #> 6: 2 3
    #> 7: 3 4
    #> 8: 3 7
    #> 9: 3 6
    dt[a!=1,]
    #>    a b
    #> 1: 2 1
    #> 2: 2 5
    #> 3: 2 3
    #> 4: 3 4
    #> 5: 3 7
    #> 6: 3 6
    

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 2015-08-31
      • 2021-06-09
      • 2014-05-12
      • 1970-01-01
      • 2021-03-06
      • 2019-04-07
      • 1970-01-01
      • 2018-03-02
      相关资源
      最近更新 更多