#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()
. Но если ваши данные удобно структурированы и вы знаете, что это условие будет выполнено, дерзайте!)