R - Как сохранить отфильтрованные данные - PullRequest
0 голосов
/ 24 июня 2019

Я хотел бы спросить, как вы храните отфильтрованные значения?

У меня есть две таблицы data.table, я хочу, чтобы номер и значение Xdata были больше, чем значение Ydata -num2, и меньше, чем значение-значение Ydata2.

      library(data.table)
      xdata <- data.table(ID=c("A","B","C","D","E","F"),
                         num=c("23","11","22",
                               "54","108","59"),
                         value=c("47","38","42",
                                 "86","189","90"))


      ydata <- data.table(ID=c("A","C","F"),
                         num=c("8","20","48"),
                        num2=c("26","26","60"),
                       value=c("40","34","78"),
                      value2=c("50","60","90"))

      library(dplyr)
      outputXY <- merge(xdata, ydata, by = "ID") %>% 
                  filter(num.x > num.y & num.x < num2 & value.x > value.y & value.x < value2) %>% 
                  select(-num.y, -num2, -value.y, -value2)

Только этот вывод

1. A  23 47
2. C  22 42

Поскольку значение 90 для F не достигает условия value2 для ydata, F

отсутствует

Теперь я надеюсь, что результат будет

   ID num value
 1. B  11  38
 2. D  54  86
 3. E  108 189
 4. F  59  90

Как я могу изменить его и делать то, что я хочу?

Спасибо

1 Ответ

1 голос
/ 25 июня 2019

Вы можете использовать функцию anti_join() из dplyr, чтобы получить дополнение следующим образом:

xdata %>%
  anti_join(outputXY, by = "ID")

или за один шаг

xdata %>%
  anti_join(
    merge(xdata, ydata, by = "ID") %>% 
      filter(num.x > num.y & num.x < num2 & value.x > value.y & value.x < value2), 
    by = "ID"
  )

ПРИМЕЧАНИЕ. Форматирование num и value столбцы в виде строк приведут к неожиданным результатам.Я настоятельно рекомендую использовать:

xdata <- data.table(ID=c("A","B","C","D","E","F"),
                    num=c(23,11,22,54,108,59),
                    value=c(47,38,42,86,189,90))


ydata <- data.table(ID=c("A","C","F"),
                    num=c(8,20,48),
                    num2=c(26,26,60),
                    value=c(40,34,78),
                    value2=c(50,60,90))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...