R语言长格式数据框转宽表:生成id+变量名格式新列
实现方案
这里提供两种常用的可直接运行的实现方案:
方案1:tidyverse生态实现(代码可读性更高)
需要提前安装加载tidyverse套件:
library(tidyverse)
处理代码:
result <- df %>% group_by(id) %>% mutate(obs_id = row_number()) %>% # 标记每个个体内部的观测序号 ungroup() %>% pivot_longer(cols = c(A,B,C), names_to = "var") %>% # 转换为长表结构 unite(col = "new_col", id, var, sep = ".") %>% # 拼接成「个体编号.变量名」格式的列名 pivot_wider(names_from = new_col, values_from = value) %>% # 转换为目标宽表结构 select(-obs_id) %>% # 删除辅助用的观测序号列 as.data.frame() # 可选:转为普通数据框格式,和示例输出完全对齐
方案2:纯Base R实现(无需安装额外依赖包)
# 按个体id拆分原始数据 df_split <- split(df, df$id) # 遍历每个子表重命名列后按列合并 result <- do.call(cbind, lapply(names(df_split), function(id_val) { sub_df <- df_split[[id_val]] # 删除id列,保留A/B/C三个变量 sub_df <- sub_df[, c("A", "B", "C")] # 按照要求重命名列 colnames(sub_df) <- paste0(id_val, ".", colnames(sub_df)) return(sub_df) })) # 重置行名(可选) rownames(result) <- NULL
内容的提问来源于stack exchange,提问作者Economist_Ayahuasca
相关产品推荐
相关产品推荐

