我想问,如何保持过滤值?
我有两个数据。标题,我希望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
如何修改它并做我想做的事?
谢谢
您可以使用dplyr
的anti_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"
)
注意:将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))