首页 文章

R两个表合并并为重复值创建新列

提问于
浏览
-2

大家好,我正在尝试合并两个数据框并创建包含唯一列的新数据框,并为重复值创建新列 . 例如,两个数据帧是:

DF1

col1 col2
A    B
C    D

DF2

col1 col2 col3
A    B    E
A    B    F
C    D    G
C    D    H
C    D    I

目标输出是

col1 col2 col3 col4 col5
A    B    E    F
C    D    G    H    I

希望您能够帮助我 . 谢谢!

1 回答

  • 1

    所以我不确定天气你所追求的最终格式是否有用 . 但是,第一步是简单的左连接或完全连接

    df1 <- data.frame(col1 = c("A", "C"),
                      col2 = c("B", "D"), stringsAsFactors = F)
    
    df2 <- data.frame(col1 = c("A", "A", "C", "C", "C"),
                      col2 = c("B", "B", "D", "D", "D"),
                      col3 = c("E", "F", "G", "H", "I"), stringsAsFactors = F)
    
    library(tidyverse)
    
    res <- left_join(df1, df2, by = c("col1", "col2"))
    res
    
      col1 col2 col3
    1    A    B    E
    2    A    B    F
    3    C    D    G
    4    C    D    H
    5    C    D    I
    

    以期望的形式获得结果有点棘手 . 首先,我们进行与上面相同的左连接,然后我们将两列( col1col2 )联合在一起,以便我们可以轻松地对这些列进行分组和传播 .

    按联合列( fuse )分组我们想要一个与组内每个 col3 值相关联的数字,我们将 "col" 粘贴为前缀,以便在传播时它显示为列名 .

    然后我们通过计数器列 n 进行传播,并使用 col3 的值填充它 .

    最后,我们扭转了我们之前做过的团结 .

    left_join(df1, df2, by = c("col1", "col2")) %>%
      unite(fuse, col1, col2) %>%
      group_by(fuse) %>%
      mutate(n = paste0("col", 2 + 1:n())) %>%
      spread(n, col3) %>%
      separate(fuse, c("col1", "col2"))
    
    
    # A tibble: 2 x 5
      col1  col2  col3  col4  col5 
      <chr> <chr> <chr> <chr> <chr>
    1 A     B     E     F     NA   
    2 C     D     G     H     I
    

相关问题