отфильтровать несколько столбцов вместе с критериями - R - PullRequest
2 голосов
/ 27 марта 2019

Я нашел много похожих вопросов ( 1 , 2 , 3 - некоторые из них), но ни один из них не отвечает на мой:

У меня есть эти данные:

set.seed(100)
df <- data.frame(X = sample(1:10, 100, replace=TRUE),
                 Y = sample(11:90, 100, replace=TRUE),
                 Z = sample(1000:2000, 100, replace=TRUE),
                 stringsAsFactors = FALSE)
x <- data.frame(X = c(7, 5, 3, 9),
                     Y = c(14, 13, 19, 87),
                     stringsAsFactors = FALSE)

Где x - это подмножество df с определенной группировкой и вычислениями. А теперь я пытаюсь отфильтровать df по обоим x столбцам. Например, для конкретной строки в df это должно быть X=7 и Y=14, чтобы быть TRUE, или X=5 и Y=13, чтобы быть TRUE, это должно быть FALSE если X=7 и Y<>14 и т. д. Итак, критерии должны учитывать обе колонки вместе. Я пытался с этим:

> df[df$X == x$X & df$Y == x$Y,]
   X  Y    Z
28 9 87 1071

И это дает мне только одно истинное значение, когда я знаю, что оно должно быть не менее 4 (потому что x является подмножеством df)

Это то, что я ищу (это дает мне 0 строк):

df[df[,c("X","Y")] %in% x[,c("X","Y")],]

Ожидаемый результат:

   X  Y    Z
16 7 14 1632
28 9 87 1071
30 3 19 1297
38 7 14 1701
67 5 13 1323
77 9 87 1484
88 3 19 1951

1 Ответ

1 голос
/ 27 марта 2019

Может быть, нам понадобится inner_join

library(dplyr)
inner_join(df, x)
#  X  Y    Z
#1 7 14 1632
#2 9 87 1071
#3 3 19 1297
#4 7 14 1701
#5 5 13 1323
#6 9 87 1484
#7 3 19 1951

Если нам нужно, чтобы имена строк также соответствовали

df[do.call(paste, df[names(x)]) %in% do.call(paste, x),]
#   X  Y    Z
#16 7 14 1632
#28 9 87 1071
#30 3 19 1297
#38 7 14 1701
#67 5 13 1323
#77 9 87 1484
#88 3 19 1951
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...