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))
原始长格式数据
| 行号 | ID | AJ_Vol |
|---|---|---|
| 21 | TRCC1 | 14.454166 |
| 22 | TRCC1 | 14.976905 |
| 46 | DNRC1 | 11.344002 |
| 86 | ILAC1 | 5.673755 |
期望的宽格式数据
| TRCC1 | DNRC1 | ILAC1 |
|---|---|---|
| 14.454166 | 11.344002 | 5.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
相关产品推荐
相关产品推荐

