如何在R中使用pivot_wider重塑biomarkHD格式数据?
问题:pivot_wider透视结果不符合预期,如何调整?
原始数据与当前操作
用户提供的数据框代码如下:
id_1 <- c("S78-A01", "S78-A04", "S90-A01", "S90-A04", "S82-A01", "S82-A04", "S94-A01", "S94-A04", "S75-A01", "S75-A04", "S87-A01", "S87-A04") id_2 <- c("CB-2_1:1024", "CB-2_1:1024", "CB-2_1:1024", "CB-2_1:1024", "CB-2_1:128", "CB-2_1:128", "CB-2_1:128", "CB-2_1:128", "CB-2_1:16", "CB-2_1:16", "CB-2_1:16", "CB-2_1:16") Gene <- c("AIM2", "AIM2", "AIM2", "AIM2", "AIM2", "AIM2", "AIM2", "AIM2", "AIM2", "C1QB", "C1QB", "C1QB") value1 <- c(-1.9975984661369099, 4.7789368498721396 , 3.3080754647069801, 6.9507934374320604, 2.55279730894866, 1.38567349551152, 1.99, 4.5115336458523103, 3.2588723737573799, 6.9433118002602097, 2.5897834603682202, 1.4031532547429899) df <- data.frame(id1 =id_1, id2=id_2, Gene=Gene, value1=value1)
当前执行的透视代码:
df %>% pivot_wider(names_from = c("id2","Gene"), values_from = "value1")
当前得到的结果
| id1 | CB-2_1:1024_AIM2 | CB-2_1:128_AIM2 | CB-2_1:16_AIM2 | CB-2_1:16_C1QB |
|---|---|---|---|---|
| S78-A01 | -2 | NA | NA | NA |
| S78-A04 | 4.78 | NA | NA | NA |
期望的结果
| id2 | gene | val1 | val2 | val3 |
|---|---|---|---|---|
| CB-2_1:1024 | AIM2 | -1.997589 | 4.778937 | 3.308075 |
| CB-2_1:128 | AIM2 | 2.552797 | 2.589783 | 1.403153 |
| CB-2_1:16 | C1QB | 6.943312 | 1.385673 | 1.990000 |
问题原因与解决方案
错误原因
你当前的pivot_wider操作逻辑完全不符合需求:
- 代码保留了
id1作为行标识,把id2和Gene的组合作为列名,这和你想要的按id2+Gene分组,将组内value1转为多列的逻辑完全相反。
正确实现方式
要得到期望的格式,需要先给每个(id2, Gene)分组内的行添加序号,再以此序号作为列名进行透视:
library(dplyr) library(tidyr) # 给每个(id2, Gene)分组内的行生成序号 df_processed <- df %>% group_by(id2, Gene) %>% mutate(row_num = paste0("val", row_number())) %>% ungroup() # 执行透视 df_wide <- df_processed %>% pivot_wider( names_from = row_num, # 用生成的序号作为新列名 values_from = value1, # 对应的值是value1 id_cols = c(id2, Gene) # 保留id2和Gene作为行标识 )
执行结果示例
运行上述代码后,得到的结果与你期望的格式一致(以示例数据为例):
| id2 | Gene | val1 | val2 | val3 | val4 |
|---|---|---|---|---|---|
| CB-2_1:1024 | AIM2 | -1.997598 | 4.778937 | 3.308075 | 6.950793 |
| CB-2_1:128 | AIM2 | 2.552797 | 1.385673 | 1.990000 | 4.511534 |
| CB-2_1:16 | AIM2 | 3.258872 | NA | NA | NA |
| CB-2_1:16 | C1QB | 6.943312 | 2.589783 | 1.403153 | NA |
如果需要过滤掉AIM2在CB-2_1:16的行,可额外添加filter步骤,根据你的实际数据调整即可。
内容的提问来源于stack exchange,提问作者lmrogers34
相关产品推荐
相关产品推荐

