【问题标题】:Identify which row of data.frame exactly matches a vector确定哪一行 data.frame 与向量完全匹配
【发布时间】:2020-02-03 19:37:35
【问题描述】:

给定这个data.frame:

var1 <- c(1, 2)
var2 <- c(3, 4)
var3 <- c(5, 6)
df <- expand.grid(var1 = var1, var2 = var2, var3 = var3)

  var1 var2 var3
1    1    3    5
2    2    3    5
3    1    4    5
4    2    4    5
5    1    3    6
6    2    3    6
7    1    4    6
8    2    4    6

我想确定与该向量匹配的 data.frame 行号(本例中的答案为 4):

vec <- c(var1 = 2, var2 = 4, var3 = 5)

var1 var2 var3 
   2    4    5 

我似乎无法整理出简单的子集方法。我能想到的最好的方法如下:

working <- apply(df, 2, match, vec)
which(apply(working, 1, anyNA) == FALSE)

这似乎不如预期的那么简单;我想知道是否有更直接的解决方案?

【问题讨论】:

    标签: r subset apply


    【解决方案1】:

    为了完整起见,可以使用data.tablejoin实现子集:

    library(data.table)
    setDT(df)[as.list(vec), on = names(vec), which = TRUE]
    
    [1] 4
    

    【讨论】:

      【解决方案2】:

      这是一个 dplyr 选项:

      library(dplyr)
      library(magrittr)
      
      df %>% mutate(new=paste0(var1,var2,var3), num=row_number()) %>% 
          filter(new=="245") %>% select(num) %>% as.integer()
      
      [1] 4
      

      【讨论】:

        【解决方案3】:

        我们可以转置数据帧,将其与vec 进行比较,然后选择所有值匹配的行。

        which(colSums(t(df) == vec) == ncol(df))
        #[1] 4
        

        【讨论】:

        • 优秀。喜欢这个使用 base 的解决方案。
        【解决方案4】:

        这可以使用prodlim 库来解决:

        > library(prodlim)
        > row.match(vec, df)
        [1] 4
        

        【讨论】:

          猜你喜欢
          • 2010-12-03
          • 2017-04-13
          • 1970-01-01
          • 2020-06-01
          • 2013-02-09
          • 1970-01-01
          • 2021-11-18
          • 2020-07-06
          相关资源
          最近更新 更多