如何在R中使用pivot_wider合并行实现数据宽表重塑?
问题描述
我有如下格式的数据集:
| id | group | A | B | C | D |
|---|---|---|---|---|---|
| id1 | 2 | 0 | 81 | 0.01 | 81 |
| id1 | 3 | 115 | 66 | 0.05 | 181 |
| id2 | 2 | 0 | 58 | 0.01 | 58 |
| id2 | 3 | 0 | 110 | 0.01 | 110 |
| id3 | 2 | 95 | 81 | 0.03 | 176 |
| id4 | 2 | 40 | 126 | 0.02 | 166 |
需要将其重塑为如下宽表格式:
| id | A_1 | A_2 | A_3 | B_1 | B_2 | B_3 | C_1 | C_2 | C_3 | D_1 | D_2 | D_3 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| id1 | 0 | 0 | 115 | 0 | 81 | 66 | 0 | 0.01 | 0.05 | 0 | 81 | 181 |
| id2 | 0 | 0 | 0 | 0 | 58 | 110 | 0 | 0.01 | 0.01 | 0 | 58 | 110 |
| id3 | 0 | 95 | 0 | 0 | 81 | 0 | 0 | 0.03 | 0 | 0 | 176 | 0 |
| id4 | 0 | 40 | 0 | 0 | 126 | 0 | 0 | 0.02 | 0 | 0 | 166 | 0 |
我尝试了单独处理每个变量的代码:
test <- pivot_wider(data, names_from = group, values_from = A)
但结果没有合并id行,也没得到目标结构,请问该怎么修正代码?
解决方案
直接一次性指定所有要转换的变量,同时设置缺失值填充规则,就能自动按id合并行并生成目标格式。具体代码如下:
library(tidyr) # 假设你的原始数据框名为data test <- pivot_wider( data, id_cols = id, # 明确按id分组合并 names_from = group, values_from = c(A, B, C, D), # 同时处理所有需要宽表化的变量 names_glue = "{.value}_{.name}", # 生成「变量_分组」格式的列名 values_fill = 0 # 缺失的分组(比如group=1)自动填充0 )
关键参数说明:
id_cols = id:强制以id作为分组依据,确保相同id的行自动合并。values_from = c(A, B, C, D):不用单独处理每个变量,一次性批量转换所有目标变量。names_glue:精准控制列名格式,完美匹配你需要的A_1、B_3这类命名。values_fill = 0:原始数据里没有group=1的记录,转换后对应位置自动补0,和目标格式一致。
运行这段代码就能得到你想要的宽表结构。
内容的提问来源于stack exchange,提问作者jakim_M
相关产品推荐
相关产品推荐

