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

如何用pivot_longer转换Case/Control样本数据并消除NA值?

问题

原始数据框:

gene_id gene_short_name S1-Case S2-Case S3-Case S4-Control S5-Control S6-Control
EN0001  TFG             0.003   0.001   0.002   0.001       0.002     0.003

期望转换后的格式:

gene_id gene_short_name Case   Control
EN0001  TFG             0.003  0.001
EN0001  TFG             0.001  0.002
EN0001  TFG             0.002  0.003

尝试的代码:

df_longer <- pivot_longer(df, cols  = -c(gene_id, gene_short_name), names_to = c("sample", ".value"), 
         names_sep = "-", names_repair = "check_unique" )

得到的含NA的结果:

gene_id gene_short_name  Sample Case   Control
EN0001     TFG              S1      0.003  NA
EN0001     TFG              S2      0.001  NA
EN0001     TFG              S3      0.002  NA
EN0001     TFG              S4      NA     0.001
EN0001     TFG              S5      NA     0.002
EN0001     TFG              S6      NA     0.003

疑问:能否在pivot_longer中直接消除这些NA值,还是需要先重新整理数据?


解决方案

你之前的方法之所以产生NA,是因为用.value拆分列名时,Case组样本(S1-S3)没有Control对应值,Control组样本(S4-S6)没有Case对应值,因此必然出现空缺。无法直接在pivot_longer一步到位得到目标格式,需要先转长格式拆分信息,再转宽格式匹配对应值:

步骤1:转长格式拆分样本编号和分组

先把所有表达量列转成长格式,拆分出样本编号(如S1)和分组(Case/Control):

df_long <- pivot_longer(df, 
                        cols = -c(gene_id, gene_short_name), 
                        names_to = c("sample_num", "group"), 
                        names_sep = "-",
                        values_to = "expression")

步骤2:转宽格式匹配Case和Control值

再以基因信息和样本编号为分组,将Case和Control转成并列列:

df_final <- pivot_wider(df_long, 
                        id_cols = c(gene_id, gene_short_name, sample_num), 
                        names_from = group, 
                        values_from = expression) %>%
  select(-sample_num)  # 不需要样本编号可删除此行

合并两步的简洁写法:

df_final <- df %>%
  pivot_longer(cols = -c(gene_id, gene_short_name), 
               names_to = c("sample_num", "group"), 
               names_sep = "-",
               values_to = "expression") %>%
  pivot_wider(id_cols = c(gene_id, gene_short_name), 
              names_from = group, 
              values_from = expression)

最终得到的结果就是你想要的格式:

gene_id gene_short_name  Case Control
  <chr>   <chr>           <dbl>   <dbl>
1 EN0001  TFG             0.003   0.001
2 EN0001  TFG             0.001   0.002
3 EN0001  TFG             0.002   0.003

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:14:57