在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
相关产品推荐
相关产品推荐

