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

在R语言中基于相同ID将分组列值匹配到纵向长数据集

在R中为纵向数据集匹配分组信息

现有两个数据集:

  • 映射数据集df1,包含参与者id和对应的分组group:
df1 <- structure(list(id = 1:8, group = c("a", "b", "a", "c", "a", "a", 
"b", "d")), class = "data.frame", row.names = c(NA, -8L))
  • 纵向数据集df2,id重复出现但无分组列,需要新增new_group列,填充对应id的分组值,目标结构如下:
df2 <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 6L, 6L, 6L, 7L, 7L, 8L, 8L, 8L, 8L
), new_group = c("a", "a", "a", "a", "b", "b", "b", "b", "a", 
"a", "c", "c", "c", "c", "c", "c", "a", "a", "a", "a", "b", "b", 
"d", "d", "d", "d")), class = "data.frame", row.names = c(NA, 
-26L))

以下是几种实现需求的方法:

方法1:基础R的merge()函数

用基础R内置的merge()做左连接,保留df2所有行并匹配分组信息,之后重命名列:

# 执行左连接
df2 <- merge(df2, df1, by = "id", all.x = TRUE)
# 重命名列以匹配目标结构
df2$new_group <- df2$group
df2$group <- NULL

方法2:dplyr包的left_join()函数

如果使用tidyverse生态,dplyr的写法更简洁直观:

library(dplyr)

df2 <- df2 %>%
  left_join(df1, by = "id") %>%
  rename(new_group = group)

该方法会自动保留df2的全部行,将匹配到的group值填充到对应位置,最后直接重命名列即可。

方法3:data.table包的高效匹配

针对大数据集,data.table的连接速度更快,操作更灵活:

library(data.table)

# 转换为data.table格式
setDT(df1)
setDT(df2)

# 直接在df2中新增new_group列并填充匹配值
df2[df1, new_group := group, on = "id"]

内容的提问来源于stack exchange,提问作者Ali Roghani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:24:24