R语言如何将3列72行dataframe转换为9列9行的数据框
R语言3列72行数据框转9列9行结构实现方案
该转换属于典型的长表转宽表操作,按分组维度拆分后横向拼接即可,无需编写复杂循环,下面提供两种可直接运行的实现方案:
方案1:tidyverse实现(代码简洁不易错)
如果未安装tidyverse包,先运行安装命令,已安装可直接跳过:
install.packages("tidyverse") library(tidyverse)
假设原始数据框命名为df_raw,运行以下代码即可得到目标结构:
df_target <- df_raw %>% # 按行、列分组维度排序,避免数据错位 arrange(.[[1]], .[[2]]) %>% # 为每个行分组生成对齐用的行序号 group_by(.[[1]]) %>% mutate(rn = row_number()) %>% # 执行长转宽操作 pivot_wider(names_from = names(.)[2], values_from = names(.)[3]) %>% # 移除临时生成的序号列 select(-rn) %>% ungroup()
如果你的分组列、值列不是默认的第1、2、3列,把代码中对应的列索引替换为实际列名即可。
方案2:基础R实现(无第三方包依赖)
无需安装任何扩展包,直接运行以下代码:
# 按第一列的行分组拆分原始数据 split_data <- split(df_raw, f = df_raw[[1]]) # 按行对齐横向拼接全部分组 df_target <- as.data.frame(do.call(cbind, split_data)) # 移除拼接产生的重复分组列 df_target <- df_target[, !duplicated(names(df_target))]
注意事项
- 运行代码前先清理原始数据的缺失值、多余空行,避免拼接错位
- 快速校验逻辑:统计原始数据第一列去重后共9个值、第二列去重后共8个值时,上述代码输出结果即为9行9列的目标结构,和你给出的样例结构完全匹配
- 若输出列名顺序不符合预期,可使用
select()函数(tidyverse方案)或列索引调整顺序即可
内容的提问来源于stack exchange,提问作者Zac
相关产品推荐
相关产品推荐

