Подтвердить что ты не робот

Удалять строки условно из таблицы данных. R

У меня есть таблица данных с полями {id, menuitem, amount}.

Это данные транзакции, поэтому идентификаторы уникальны, но menuitem повторяется. Теперь я хочу удалить все записи, где menuitem == 'coffee'.

Также, нужно удалить все строки, где amount <= 0;

Каков правильный способ сделать это в data.table?

Я могу использовать data$menuitem!='coffee', а затем индексировать int в data [] - но это не обязательно эффективно и не использует преимущества data.table.

Оценены любые указатели в правильном направлении.

4b9b3361

Ответ 1

В этом случае он не отличается от 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