You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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 = "")

输出结果示例(与你预期格式匹配):

IDclass12345
A21025
A410
A52015
B120
B22510
B3
B510
C115
C21515
C310
C410
C515

方法二:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:45:34