Semi_join, фильтрующий R-фрейм данных условно - PullRequest
0 голосов
/ 06 марта 2019

Кадр данных 1 (df1) имеет следующие столбцы:

Year ID1 ID2 V1 V2 ....

Кадр данных 2 (df2) имеет следующие столбцы:

Year ID 

Я хотел бы сделать semi_joinиспользование df2 для фильтрации df1 как по году, так и по идентификатору, за исключением того, что я хотел бы сохранить наблюдения в df1, где идентификатор совпадает либо по ID1, либо по ID2.Я не уверен, есть ли способ у semi_join в dplyr или это другой метод.

Редактировать:

df1 = data.frame(Year = c(rep(2000,5), rep(2001,5)), 
                 ID1 = 1:5, 
                 ID2 = 5:1,
                 V1 = seq(1,10, length.out = 10))
df2 = data.frame(Year = c(2000,2000,2001,2001), ID = c(1,2,1,3))

Вывод

 Year ID1 ID2 V1
 2000 1   5    1
 2000 2   4    2
 2000 4   2    4
 2000 5   1    5
 2001 1   5    6
 2001 3   3    8
 2001 5   1   10

1 Ответ

2 голосов
/ 06 марта 2019

Это не элегантно, но вы можете выполнить полусоединение для каждого идентификатора отдельно, а затем объединить результаты:

bind_rows(
  semi_join(df1, df2, by = c("ID1" = "ID"),
  semi_join(df1, df2, by = c("ID2" = "ID")
) %>%
  distinct()

(не проверено, без образца набора данных.)

...