在R语言中将纵向数据集转换为横向数据集的方法求助
数据格式转换:从纵向到横向的实现方法
原始纵向数据集
| ID | Age |
|---|---|
| 1 | 19 |
| 1 | 22 |
| 2 | 20 |
| 2 | 21 |
目标横向数据集
| Age | ID=1 | ID=2 |
|---|---|---|
| 19 | 1 | na |
| 20 | na | 1 |
| 21 | na | 1 |
| 22 | 1 | na |
实现步骤(R语言)
你之前用t()或spread()没得到理想结果,核心原因是原始数据缺少所有Age与ID的组合记录,直接转换无法自动补全缺失的行和值。可以按以下步骤操作:
- 先构造原始数据框:
df <- data.frame( ID = c(1, 1, 2, 2), Age = c(19, 22, 20, 21) )
- 添加标记列,用于标识该ID对应Age是否存在:
df$present <- 1
- 生成所有Age与ID的完整组合,左连接原始数据补全缺失项,再转换为宽表:
方法1:使用pivot_wider(tidyverse推荐函数)
library(tidyverse) result_df <- expand_grid(Age = unique(df$Age), ID = unique(df$ID)) %>% left_join(df, by = c("Age", "ID")) %>% pivot_wider(names_from = ID, values_from = present, names_prefix = "ID=") # 查看结果 print(result_df)
方法2:使用spread(旧版tidyr函数)
library(dplyr) library(tidyr) result_df <- expand.grid(Age = unique(df$Age), ID = unique(df$ID)) %>% left_join(df, by = c("Age", "ID")) %>% spread(key = ID, value = present, names_prefix = "ID=") # 查看结果 print(result_df)
执行后就能得到你想要的横向数据集,其中缺失的位置会显示为NA(对应目标里的na)。
内容的提问来源于stack exchange,提问作者user13195765
相关产品推荐
相关产品推荐

