簡體   English   中英

從 R 中的 data.table 有條件地刪除行

[英]Remove rows conditionally from a data.table in R

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

這是交易數據 - 因此,id 是唯一的,但 menuitem 重復。 現在,我想刪除menuitem == 'coffee'所有條目。

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

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

我可以使用data$menuitem!='coffee'然后將 int 索引到 data[] - 但這不一定有效並且沒有利用 data.table。

任何指向正確方向的指針都值得贊賞。

在這種情況下,它與data.frame沒有太大區別

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

通過引用刪除/添加行它是要實現的。 您可以在此問題中找到更多信息

關於速度:

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

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM