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

R语言中使用pivot_wider转换长格式DataFrame为宽格式的异常问题

问题描述

我有一个包含1000+行的长格式DataFrame,需要按ID转换为宽格式,但用pivot_wider转换时只返回第一列的值,无法得到所有列的数据。

测试代码

# Test data
df <- data.frame(
  ID = c("TRCC1", "TRCC1", "DNRC1", "ILAC1"),
  AJ_Vol = c(14.454166, 14.976905, 11.344002, 5.673755)
)

# Use spread to pivot the dataframe
wide_df <- pivot_wider(df, names_from = ID, values_from = AJ_Vol, values_fn =  list(AJ_Vol = list))

原始长格式数据

行号IDAJ_Vol
21TRCC114.454166
22TRCC114.976905
46DNRC111.344002
86ILAC15.673755

期望的宽格式数据

TRCC1DNRC1ILAC1
14.45416611.3440025.673755
14.976905

解决方案

问题出在两个关键地方:

  • 测试数据的语法错误:创建data.frame时,ID列的字符串值未加引号,R会将其视为变量而非字符串,导致数据初始化异常。
  • values_fn用法错误:使用list(AJ_Vol = list)会让每个单元格返回列表格式,无法展开成多行结构。

要实现目标宽格式,需先给每个ID的重复条目添加组内序号,再执行转换:

修正后的代码

library(tidyr)
library(dplyr)

# 修正测试数据(为字符串添加引号)
df <- data.frame(
  ID = c("TRCC1", "TRCC1", "DNRC1", "ILAC1"),
  AJ_Vol = c(14.454166, 14.976905, 11.344002, 5.673755),
  stringsAsFactors = FALSE
)

# 为每个ID的条目添加组内序号
df <- df %>%
  group_by(ID) %>%
  mutate(row_num = row_number()) %>%
  ungroup()

# 转换为宽格式,空值用NA填充
wide_df <- pivot_wider(df, 
                       names_from = ID, 
                       values_from = AJ_Vol,
                       values_fill = NA)

# 移除辅助列,查看最终结果
wide_df %>% select(-row_num)

输出结果

# A tibble: 2 × 3
  TRCC1  DNRC1  ILAC1
  <dbl>  <dbl>  <dbl>
1 14.5   11.3    5.67
2 15.0   NA      NA  

如果需要将空值替换为空白字符串,只需把values_fill = NA改成values_fill = ""即可。

内容的提问来源于stack exchange,提问作者Koda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:46:26