R-如何保留过滤数据



我想问,如何保持过滤值?

我有两个数据。标题,我希望xData的数字和价值大于ydata的num -num2,而小于ydata的value -value2。

      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

因为f的值90未达到ydata的值2条件,所以没有f

现在我希望输出是

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

如何修改它并做我想做的事?

谢谢

您可以使用dplyranti_join()函数来获得这样的补充:

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"
  )

注意:将numvalue列格式化为字符串将导致意外结果。我强烈建议使用:

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))