【问题标题】:R function to replace tricky merge in Excel (vlookup + hlookup)R函数替换Excel中棘手的合并(vlookup + hlookup)
【发布时间】:2022-06-28 12:58:30
【问题描述】:

我有一个棘手的合并,我通常在 Excel 中通过各种公式进行合并,我想使用 R 自动化。

我有 2 个数据框,其中一个称为输入,如下所示:

id v1 v2 v3
1  A  A  C  
2  B  D  F
3  T  T  A
4  A  F  C 
5  F  F  F

还有一个叫df

id v
1 1
1 2
1 3
2 2
3 1 

我想根据 id 和 v 值组合它们,这样我得到

id v  key
1  1  A
1  2  A
1  3  C
2  2  D
3  1  T 

所以我在 id 上进行匹配,然后在从 v1 到 v2 的列上进行匹配,在第一个示例中,您将看到我匹配 id = 1 和 v1,因为 v 的值等于 1。在 Excel 中,我创造性地进行了组合VLOOKUP 和 HLOOKUP 但我想在 R 中简化这一点。Dataframe 示例是简化版本,因为我有更多记录和值,从 v1 到 50。

谢谢!

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    你可以使用pivot_longer:

    library(tidyr)
    library(dplyr)
    
    key %>% pivot_longer(!id,names_prefix='v',names_to = 'v') %>% 
            mutate(v=as.numeric(v)) %>%
            inner_join(df)
    
    Joining, by = c("id", "v")
    # A tibble: 5 × 3
         id     v value
      <int> <dbl> <chr>
    1     1     1 A    
    2     1     2 A    
    3     1     3 C    
    4     2     2 D    
    5     3     1 T 
    

    数据:

    key <- read.table(text="
    id v1 v2 v3
    1  A  A  C  
    2  B  D  F
    3  T  T  A
    4  A  F  C 
    5  F  F  F",header=T)
    
    df <- read.table(text="
    id v
    1 1
    1 2
    1 3
    2 2
    3 1 ",header=T)
    

    【讨论】:

      【解决方案2】:

      您可以使用两个列矩阵作为“[”的索引参数,因此这是一个单行。 (不是数据对象的名称是d1d2。我反对使用df 作为数据对象名称。)

       d1[-1][ data.matrix(d2)]  # returns [1] "A" "A" "C" "D" "T"
      

      所以完整的解决方案是:

        cbind( d2, key= d1[-1][ data.matrix(d2)] )
        id v key
      1  1 1   A
      2  1 2   A
      3  1 3   C
      4  2 2   D
      5  3 1   T
      

      【讨论】:

        【解决方案3】:

        试试这个:

        x <- "
        id v1 v2 v3
        1  A  A  C  
        2  B  D  F
        3  T  T  A
        4  A  F  C 
        5  F  F  F
        "
        y <- "
        id v
        1 1
        1 2
        1 3
        2 2
        3 1 
        "
        
        df <- read.table(textConnection(x) , header = TRUE)
        df2 <- read.table(textConnection(y) , header = TRUE)
        
        key <- c()
        
        for (i in 1:nrow(df2)) {
          key <- append(df[df2$id[i],(df2$v[i] + 1L)] , key)
        }
        
        
        df2$key <- rev(key)
        
        df2
        >#   id v key
        ># 1  1 1   A
        ># 2  1 2   A
        ># 3  1 3   C
        ># 4  2 2   D
        ># 5  3 1   T
        

        reprex package (v2.0.1) 于 2022-06-06 创建

        【讨论】:

          猜你喜欢
          • 2014-03-05
          • 1970-01-01
          • 1970-01-01
          • 2015-06-25
          • 2015-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-07
          相关资源
          最近更新 更多