我有一个data.table,其字段为{id,menuitem,amount}。
这是交易数据 - 因此,ID是唯一的,但menuitem重复。现在,我想删除menuitem == 'coffee'
。
另外,要删除amount <= 0
;
在data.table中执行此操作的正确方法是什么?
我可以使用data$menuitem!='coffee'
然后将int索引到data []中 - 但这不一定有效,也不会利用data.table。
赞赏任何正确方向的指针。
答案 0 :(得分:47)
在这种情况下,它与data.frame
data <- data[ menuitem != 'coffee' | amount > 0]
通过引用删除/添加行将被实现。您可以在this question
中找到更多信息关于速度:
1您可以通过执行以下操作来获益:
setkey(data, menuitem)
data <- data[!"coffee"]
比data <- 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
答案 1 :(得分:0)
尝试一下:
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