R dataframe按groupID匹配关联行 将指定列值追加为带后缀新列
R语言实现同组关联行值互填方案
前置修正说明
你提供的示例数据中groupID长度仅为8,与16行数据长度不匹配,我们先修正为每组2行的符合业务逻辑的结构:
df <- data.frame(personID = c(1:16), groupID = rep(1:8, each = 2), # 每组2名成员,共8组 columnA = rnorm(16, mean = 4, sd = 1), columnB = seq(2,32,by=2), columnC = rbinom(16, 1, .7) )
方案1:使用dplyr(tidyverse生态,易用性高)
核心逻辑是按groupID分组后,反转每组内的目标列值,刚好得到同组另一名成员的对应数值,自动生成带_teammate后缀的新列:
library(dplyr) df_result <- df %>% group_by(groupID) %>% # 指定仅处理columnA、columnB,自动生成后缀为_teammate的新列 mutate(across(c(columnA, columnB), ~rev(.), .names = "{.col}_teammate")) %>% ungroup()
方案2:Base R实现(无第三方包依赖)
使用ave函数按组计算,无需安装额外包:
df$columnA_teammate <- ave(df$columnA, df$groupID, FUN = rev) df$columnB_teammate <- ave(df$columnB, df$groupID, FUN = rev)
两种方案最终输出的结果中,同一groupID的两行,columnA_teammate会存储对方的columnA值,columnB_teammate会存储对方的columnB值,columnC保持原有内容不变,完全符合需求。
内容的提问来源于stack exchange,提问作者Jonathan Cloughesy
相关产品推荐
相关产品推荐

