我有数据.带有{id,menuitem,amount}字段的表.
这是事务数据——因此,ID是唯一的,但menuitem会重复.现在,我想删除所有menuitem == 'coffee'
的条目.
此外,要删除所有包含amount <= 0
行的行;
在数据中,正确的方法是什么.桌子
我可以使用data$menuitem!='coffee'
,然后将int索引到数据[]中——但这并不一定有效,也不利用数据.桌子
任何指向正确方向的指示都是值得赞赏的.
我有数据.带有{id,menuitem,amount}字段的表.
这是事务数据——因此,ID是唯一的,但menuitem会重复.现在,我想删除所有menuitem == 'coffee'
的条目.
此外,要删除所有包含amount <= 0
行的行;
在数据中,正确的方法是什么.桌子
我可以使用data$menuitem!='coffee'
,然后将int索引到数据[]中——但这并不一定有效,也不利用数据.桌子
任何指向正确方向的指示都是值得赞赏的.
在这种情况下,它与data.frame
没有太大区别
data <- data[ menuitem != 'coffee' | amount > 0]
通过引用删除/添加行,这将被实现.你可以在this question中找到更多信息
关于速度:
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