【问题标题】:Create a subsetting function according to one or more couple of values for a data.frame根据 data.frame 的一对或多对值创建子集函数
【发布时间】:2014-02-22 17:50:46
【问题描述】:

如何制作一个函数来使用一对或多对值(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

------------------哈德利回答后的解决方案

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

【问题讨论】:

    标签: r function dataframe subset


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      除非我遗漏了什么,否则您可以使用 base R 的 merge()

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

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

      【讨论】:

      • 我认为合并在大多数情况下都会起作用,但我不确定它在 x 或 y 中行重复的边缘情况下的行为。
      • @hadley -- 据我所知,它工作得很好。要查看它如何处理重复行,只需执行以下操作:df2 &lt;- rbind(df, df[9,]); match2 &lt;- match[c(1,1,1,2),]。然后,根据您希望如何处理match2 中的重复行,执行merge(df2, match2)merge(df2, unique(match2))
      • 如果您在两者中都有重复的行?它做笛卡尔积吗?我确定我制作semi_join() :/ 是有原因的(除了名称的速度和通信价值)
      • @hadley -- 例如我在之前的评论中给出的确实df2match2 中都有重复的行。
      • 呵呵,好点子。哦,但是semi_join() 永远不会改变行的顺序,不像merge()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      相关资源
      最近更新 更多