根据data.frame的一个或多个值创建子集函数

时间:2014-01-30 12:15:29

标签: r function dataframe subset

如何使函数使用一对或多对值(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 个答案:

答案 0 :(得分:3)

听起来你想要一个半连接:找到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)

答案 1 :(得分:2)

除非我遗漏了某些东西,否则你可以使用基础R merge()

使用Hadley提供的两个示例data.frames,

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