从 R 中的 data.table 有条件地删除行

问题描述 投票:0回答:3

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

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

menuitem == 'coffee'
.

的条目

另外,想要删除

amount <= 0
;

的所有行

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

我可以使用

data$menuitem!='coffee'
,然后将 int 索引到 data[] 中 - 但这不一定有效,并且不能利用 data.table。

任何正确方向的指点都值得赞赏。

r data.table
3个回答
70
投票

在这种情况下,它与

data.frame

没有太大不同
data <- data[ menuitem != 'coffee' | amount > 0] 

通过引用删除/添加行将被实现。您可以在这个问题

中找到更多信息

关于速度:

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

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

这会比

data <- data[ menuitem != 'coffee']
更快。但是,要应用您在问题中提出的相同过滤器,您将需要滚动连接(我已经完成午休时间,我可以稍后添加一些内容:-))。

2 即使没有关键数据。对于相对较大的表,表也会快得多(少量行的速度类似)

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

3
投票

试试这个:

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

0
投票

上述答案有效,但也会删除 menuitem 为 NA 的行。如果您想保留这些,您可以“或”该情况,例如:

数据<- data[ ( (menuitem != 'coffee') | is.na(menuitem) )| amount >0]

© www.soinside.com 2019 - 2024. All rights reserved.