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
希望你能帮助我。谢谢!
答案 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