如何用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
相关产品推荐
相关产品推荐

