Как фильтровать строки во фрейме данных R с несколькими парами значений столбцов

#r #tidyverse

Вопрос:

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

 income infant region oil Saudi.Arabia 1530 650.0 Asia yes Afganistan 75 400.0 Asia no Libya 3010 300.0 Africa yes Zambia 310 259.0 Africa no Guinea 79 216.0 Africa no Burma 73 200.0 Asia no  

У меня есть (1) значения выбросов и (2) название соответствующей области для каждого значения.

 gt; out$out # values [1] 300.0 170.0 650.0 400.0 44.8 43.3 gt; out$names[out$group] # name of region corresponding to each outlier [1] "Africa" "Americas" "Asia" "Asia" "Europe" "Europe"   

Теперь я хочу отфильтровать фрейм данных для строк, соответствующих каждой паре значений. Например, я хочу, чтобы имя строки для строки со infant значением 170 region было одинаковым. Я не могу использовать совместное условие, при котором значения столбцов находятся в обоих списках, потому что есть другие строки с одинаковыми значениями, но разными группами (поскольку они не являются выбросами в своей группе).

Я знаю, что мог бы сделать это в два этапа, но мне интересно, есть ли более элегантное решение в R для этого.

Заранее большое спасибо!

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

1. Если вы предоставите данные в легко переносимом формате, мы могли бы помочь в дальнейшем. Первое, что приходит в голову, — это преобразовать список «выход» в именованный список, после чего вы сможете легко сопоставить значение с регионом

Ответ №1:

 df lt;- data.frame(income = c(1530, 75, 3010, 310, 79, 73),   infant = c(650, 400, 300, 259, 216, 200),   region = c("Asia", "Asia", "Africa", "Africa", "Africa", "Asia"),   oil = c("yes", "no", "yes", "no", "no", "no"),   row.names = c("Saudi.Arabia", "Afganistan", "Libya",   "Zambia", "Guinea", "Burma"))  df  # income infant region oil # Saudi.Arabia 1530 650 Asia yes # Afganistan 75 400 Asia no # Libya 3010 300 Africa yes # Zambia 310 259 Africa no # Guinea 79 216 Africa no # Burma 73 200 Asia no  x lt;- c(300.0, 170.0, 650.0, 400.0, 44.8, 43.3) y lt;- c("Africa", "Americas", "Asia", "Asia", "Europe", "Europe")   df[paste0(df$infant, df$region) %in% paste0(x, y),]  # income infant region oil # Saudi.Arabia 1530 650 Asia yes # Afganistan 75 400 Asia no # Libya 3010 300 Africa yes