Подмножество фрейма данных на двух условиях исключительно для каждой строки

#r #dataframe #dplyr #subset

#r #фрейм данных #dplyr #подмножество

Вопрос:

У меня есть фрейм данных, из которого я хочу извлечь строки с определенным значением в одном столбце и другим конкретным значением в другом столбце. Я хочу перейти от df к df_final, как в приведенном ниже коде:

 x = c(25,25,25,25,44,44,44,44,44,76,76)
y = c(1,2,3,4,1,4,6,7,9,4,3)


df<- data.frame(x,y)

df1 <- df %>% filter(x == 25 amp; y == 2)
df2 <- df %>% filter(x == 44 amp; y == 6)
df3 <- df %>% filter(x == 76 amp; y == 3)

df_final <- rbind(df1,df2,df3)


# desired result:

print(df_final)
   x y
1 25 2
2 44 6
3 76 3

  

Я пытался использовать filter с dplyr, но dplyr сопоставляет все в пределах отфильтрованных x и y, что приводит к слишком большому количеству строк, продемонстрировано ниже:

 df_final <- df %>% filter(x %in% c(25,44,76) amp; y %in% c(2,6,3))


# non-desired result:

print(df_final)
   x y
1 25 2
2 25 3
3 44 6
4 76 3

  

Есть ли способ сопоставления исключительно с использованием dplyr? Первый экземпляр в отфильтрованном x к первому в отфильтрованном y, второй экземпляр в отфильтрованном x ко второму в отфильтрованном y и так далее… (Другие пакеты, кроме dplyr, тоже, конечно, в порядке)

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

1. Вы можете использовать df %>% filter(x == 25 amp; y == 2 | x == 44 amp; y == 6 | x == 76 amp; y == 3) , но я полагаю, вы ищете другой подход.

2. Спасибо @Let’stry это становится слишком длинным для моих данных, и я не могу все это жестко закодировать, но я определенно вижу вашу логику, стоящую за этим! 🙂

Ответ №1:

вы можете создать 1 условие, а затем использовать eval и parse :

 x_cond <- c(25, 44, 76)
y_cond <- c(2, 6, 3)
final_cond <- map2_chr(x_cond, y_cond, ~str_c("x == ", .x, " amp; y == ", .y)) %>%
  str_c(collapse = " | ")
df %>% filter(eval(parse(text = final_cond)))