在R语言中合并两个含分组变量的长数据框
合并R数据框a和b的解决方案
我来帮你解决这个数据框合并的问题~先明确你的数据定义,再根据不同需求给出对应的合并方法:
首先确认你的数据结构
先把数据框的定义用代码写出来:
a <- data.frame(g=c("1","2","2","3","3","3","4","4","4","4"), h=c("1","1","2","1","2","3","1","2","3","4")) b <- data.frame(g=c("1","2","3","3","3","4","4","4","4","4"), i=c("1","2","3","2","1","2","3","4","5","6"))
你的数据框结构如下:
a
g h
1 1 1
2 2 1
3 2 2
4 3 1
5 3 2
6 3 3
7 4 1
8 4 2
9 4 3
10 4 4
b
g i
1 1 1
2 2 2
3 3 3
4 3 2
5 3 1
6 4 2
7 4 3
8 4 4
9 4 5
10 4 6
常见合并方案
1. 按分组(g)+组内行位置合并(最贴合你的数据逻辑)
观察到数据框a中每个g分组下的h是连续的1到组内行数,我们可以给每个分组添加行号,再按g和行号合并,这样能让两个数据框同组内的行一一对应:
library(dplyr) # 给a添加组内行号 a_with_row <- a %>% group_by(g) %>% mutate(row_num = row_number()) %>% ungroup() # 给b添加组内行号 b_with_row <- b %>% group_by(g) %>% mutate(row_num = row_number()) %>% ungroup() # 全连接合并,保留所有行 merged_df <- full_join(a_with_row, b_with_row, by = c("g", "row_num")) # 查看结果 print(merged_df)
合并后的结果:
g h row_num i 1 1 1 1 1 2 2 1 1 2 3 2 2 2 <NA> 4 3 1 1 3 5 3 2 2 2 6 3 3 3 1 7 4 1 1 2 8 4 2 2 3 9 4 3 3 4 10 4 4 4 5 11 4 <NA> 5 6
2. 按分组g做全连接(所有同组行两两配对)
如果不需要考虑组内的行顺序,只想把所有g相同的行组合在一起,可以直接用全连接:
merged_full <- full_join(a, b, by = "g")
这种方式会生成大量组合行(比如g=4时,a的4行和b的5行会生成20行),适合需要所有配对场景的需求。
3. 按分组g+排序后合并(让h和i按数值对应)
如果希望同组内的h和i按数值顺序对应(比如g=3时h=1对应i=1,h=2对应i=2),可以先对b的组内i排序再合并:
# 对b的组内i排序并添加行号 b_sorted <- b %>% group_by(g) %>% arrange(i) %>% mutate(row_num = row_number()) %>% ungroup() # 合并 merged_sorted <- full_join(a_with_row, b_sorted, by = c("g", "row_num"))
这样g=3的行中,h和i会按1-1、2-2、3-3的方式对应。
内容的提问来源于stack exchange,提问作者captcoma
相关产品推荐
相关产品推荐

