Полу_соединенная фильтрация R-фрейма данных условно

#r #dataframe #dplyr #filtering

#r #фрейм данных #дплыр #фильтрация #dplyr

Вопрос:

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

 Year ID1 ID2 V1 V2 ....
  

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

 Year ID 
  

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

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

 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. Пожалуйста, предоставьте воспроизводимый образец данных (например, с использованием dput ) и соответствующий ожидаемый результат.

2. Возможно, лучше сначала преобразовать df1 в соответствующий формат long, а затем объединить?

3. @MauritsEvers добавил это в мой пост

Ответ №1:

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

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

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

Комментарии:

1. Если бы я мог гарантировать, что ID1 и ID2 для одного и того же наблюдения никогда не будут равны, нужно ли мне все еще применять distinct() в конце?

2. Вам все равно понадобится distinct() , на всякий случай, если оба ID1 и ID2 находятся в df2$ID . Но если бы вы могли гарантировать, что ID1 и ID2 для одного и того же наблюдения никогда не оба в df2$ID , тогда вы могли бы опустить distinct() . (Для меня проверка этого условия кажется сложнее, чем использование distinct() . Но если ваши данные удобно структурированы и вы знаете, что это условие будет выполнено, дерзайте!)