在R语言中如何按组将数据框转换为长格式?
将宽格式数据框转换为长格式(合并A/B组)
原始数据
example <- data.frame( Partner.A.s.ID = c(1101, 1102), Partner.A.s.name = c("X", "A"), Partner.B.s.ID = c(2101, 2102), Partner.B.s.name = c("Y", "B"), Partner.A.s.email = c("XXX", "AAA"), Partner.B.s.email = c("YYY", "BBB") )
方法一:拆分后合并(直观易懂)
分别提取A、B组字段并重命名,再合并两组数据:
# 提取A组数据并重命名列 part_a <- example[, c("Partner.A.s.ID", "Partner.A.s.name", "Partner.A.s.email")] colnames(part_a) <- c("Partner.ID", "Partner.name", "Partner.email") # 提取B组数据并重命名列 part_b <- example[, c("Partner.B.s.ID", "Partner.B.s.name", "Partner.B.s.email")] colnames(part_b) <- c("Partner.ID", "Partner.name", "Partner.email") # 合并两组数据 example_solution <- rbind(part_a, part_b)
方法二:使用tidyr的pivot_longer(tidyverse风格)
通过正则匹配列名结构,一步转换为长格式:
library(tidyr) example_solution <- pivot_longer(example, cols = everything(), # 正则拆分列名:匹配"Partner.组.s.属性"的结构 names_pattern = "Partner\\.(.*)\\.s\\.(.*)", # .value对应属性列,另一部分为分组标记 names_to = c("group", ".value")) %>% # 重命名属性列并移除分组标记 rename(Partner.ID = ID, Partner.name = name, Partner.email = email) %>% select(-group)
方法三:基础R的reshape函数
用原生函数实现格式转换:
example_solution <- reshape(example, direction = "long", # 指定每组对应的列集合 varying = list(c("Partner.A.s.ID", "Partner.B.s.ID"), c("Partner.A.s.name", "Partner.B.s.name"), c("Partner.A.s.email", "Partner.B.s.email")), # 设置新列名 v.names = c("Partner.ID", "Partner.name", "Partner.email"), # 不保留原行ID和分组标记 idvar = NULL, timevar = "group") %>% select(-group)
验证结果
最终生成的example_solution与预期一致:
> example_solution Partner.ID Partner.name Partner.email 1 1101 X XXX 2 1102 A AAA 3 2101 Y YYY 4 2102 B BBB
内容的提问来源于stack exchange,提问作者jo_
相关产品推荐
相关产品推荐

