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

时间:2018-03-19 03:06:41

标签: r

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

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 个答案:

答案 0 :(得分: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

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

按联合列(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