Создайте функцию подмножества в соответствии с одной или несколькими парами значений для data.frame

Как создать функцию для использования одной или более пары пар значений (x1, y1; x2, y2;... по необходимости) для подмножества кадра данных, такого как

selection <- function(x1,y1, ...){
 dfselected <- subset(df, V1 == "x1" & V2 == "y1" 
 ## MAY OR MAY NOT BE PRESENT ##
 | V1 == "x2" & V2 == "y2")
 return(dfselected)
 }

Я могу сделать это с помощью subset() для одной индексации. Пример:

df <- data.frame(
 V1 = c(rep("a",5), rep("b",5)),
 V2 = rep(c(1:5),2),
 V3 = c(101:110)
 )

т

V1 V2 V3
a 1 101
a 2 102
a 3 103
a 4 104
a 5 105
b 1 106
b 2 107
b 3 108
b 4 109
b 5 110

И подмножество для пар ( "a", "3" ) и ( "b", "4" ) выглядит как

dfselected <- subset(df, V1 == "a" & V2 == 3 | V1 == "b" & V2 == 4 )

Я не мог найти подобную функцию. Я не знаю, должен ли я передавать неопределенное количество параметров функции (так называемые "три точки" ) или использовать if/else. Я начинаю работать, поэтому ссылки и примеры тоже приветствуются. В основном я начал с этого: http://www.ats.ucla.edu/stat/r/library/intro_function.htm

------------------------------ Решение после ответа hadley

selection <- function (x,y){
 match <- data.frame(
 V1 = x,
 V2 = y,
 stringsAsFactors = FALSE
 )
 return(dplyr::semi_join(df, match))
 }
2 ответа

Похоже, вы хотите получить полу-соединение: найдите все строки в x, имеющие соответствующие записи в y:

df <- data.frame(
 V1 = c(rep("a",5), rep("b",5)),
 V2 = rep(c(1:5), 2),
 V3 = c(101:110),
 stringsAsFactors = FALSE
)
match <- data.frame(
 V1 = c("a", "b"),
 V2 = c(3L, 4L),
 stringsAsFactors = FALSE
)
library(dplyr)
semi_join(df, match)


Если мне что-то не хватает, вы можете просто использовать base R merge().

С двумя примерами данных. Кадры, предоставленные Хэдли,

merge(df, match)
# V1 V2 V3
# 1 a 3 103
# 2 b 4 109

licensed under cc by-sa 3.0 with attribution.