在R语言中转置数据框单列到行并保留结构的实现方法
解决R数据框转置与重塑问题
你需要将原数据框按ID和class作为行标识,把code的不同取值转为列,对应填充n的数值,空值留空。以下是两种可行的实现方法:
方法一:使用tidyverse工具包(推荐)
先加载dplyr和tidyr,通过pivot_wider完成数据重塑,再处理空值:
# 加载所需工具包 library(dplyr) library(tidyr) # 原始数据框 df <- data.frame(ID = c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C"), code = c(1,2,2,3,3,1,2,2,1,1,3,2,2,1,1), class = c(2,4,5,5,2,3,2,5,1,2,4,5,3,2,1), n = c(10,10,20,15,25,20,10,10,20,25,10,15,10,15,15)) # 执行数据重塑 result_tidy <- df %>% pivot_wider( id_cols = c(ID, class), # 指定行标识列 names_from = code, # 将该列的取值转为新列名 values_from = n, # 填充新列的数值来源 names_prefix = "" # 新列名无需前缀 ) %>% mutate(across(-c(ID, class), ~replace_na(.x, ""))) # 将空值替换为空白字符串 # 查看结果 print(result_tidy, na.print = "")
输出结果示例(与你预期格式匹配):
| ID | class | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| A | 2 | 10 | 25 | |||
| A | 4 | 10 | ||||
| A | 5 | 20 | 15 | |||
| B | 1 | 20 | ||||
| B | 2 | 25 | 10 | |||
| B | 3 | |||||
| B | 5 | 10 | ||||
| C | 1 | 15 | ||||
| C | 2 | 15 | 15 | |||
| C | 3 | 10 | ||||
| C | 4 | 10 | ||||
| C | 5 | 15 |
方法二:使用Base R的reshape函数
若不想加载额外工具包,可直接用Base R内置的reshape函数实现:
# 原始数据框 df <- data.frame(ID = c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C"), code = c(1,2,2,3,3,1,2,2,1,1,3,2,2,1,1), class = c(2,4,5,5,2,3,2,5,1,2,4,5,3,2,1), n = c(10,10,20,15,25,20,10,10,20,25,10,15,10,15,15)) # 执行数据重塑 result_base <- reshape(df, idvar = c("ID", "class"), timevar = "code", direction = "wide", v.names = "n") # 重命名列,去掉默认的"n."前缀 colnames(result_base) <- gsub("n\\.", "", colnames(result_base)) # 将空值替换为空白字符串 result_base[is.na(result_base)] <- "" # 查看结果 print(result_base)
该方法同样能得到与预期一致的结果。
内容的提问来源于stack exchange,提问作者starski
相关产品推荐
相关产品推荐

