You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:29:16