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

Gop*_*lem 35 r data.table

我有一个data.table,其字段为{id,menuitem,amount}.

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

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

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

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

任何指向正确方向的人都会受到赞赏.

Mic*_*ele 48

在这种情况下,它没有那么不同 data.frame

data <- data[ menuitem != 'coffee' | amount > 0] 
Run Code Online (Sandbox Code Playgroud)

通过引用删除/添加行是要实现的.您可以在此问题中找到更多信息

关于速度:

1您可以通过执行以下操作来获益:

setkey(data, menuitem)
data <- data[!"coffee"]
Run Code Online (Sandbox Code Playgroud)

这将比...更快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
Run Code Online (Sandbox Code Playgroud)

  • 是否可以就地删除 data.table 行,而不分配给新的 data.table?(有点类似于`:=`工具?) (2认同)