如何在R语言中转置多列DataFrame并为缺失值补0?
如何将长格式数据框转换为指定宽格式(缺失值填充0)
我有如下长格式的数据框:
data <- data.frame(Chromosome = c("Chr1", "Chr1", "Chr1", "Chr2","Chr2", "Chr3", "Chr3", "Chr3", "Chr5","Chr5","Chr5", "Chr5", "Chr7", "Chr7"), Value = c(150, 325, 666, 121, 111, 325, 777, 123, 325, 150, 666, 444, 32,777), Percentaje = c(90, 80,20,0.5, 0.7, 29, 13, 2,3,3,1 ,34, 56, 78))
想要转换成如下宽格式,其中某Value在对应染色体中缺失时填充0:
data2 <- data.frame(Value = c(150, 325, 666, 121, 111, 777, 123, 444, 32), Chr1 = c(90, 80, 20, 0, 0, 0, 0, 0, 0), Chr2 = c(0,0,0,0.5,0.7,0,0,0,0), Chr3 = c(0, 29, 0, 0, 0, 13, 2, 0, 0), Chr5 = c(3, 3, 1, 0,0,0,0,34,0), Chr7 = c(0,0,0,0,0,78,0,0,56))
解决方案
方法1:使用tidyverse包的pivot_wider函数
这是最简洁直观的方式,通过values_fill参数指定缺失值填充为0:
library(tidyverse) data2 <- data %>% pivot_wider( id_cols = Value, names_from = Chromosome, values_from = Percentaje, values_fill = 0 ) %>% arrange(match(Value, c(150, 325, 666, 121, 111, 777, 123, 444, 32))) # 可选:匹配目标数据的Value顺序
如果不需要严格对齐目标数据的Value顺序,可以去掉最后的arrange步骤。
方法2:使用基础R的reshape函数
若不想加载额外包,可用基础R实现:
data2 <- reshape(data, idvar = "Value", timevar = "Chromosome", direction = "wide") # 移除列名前缀 colnames(data2) <- gsub("Percentaje\\.", "", colnames(data2)) # 将缺失值替换为0 data2[is.na(data2)] <- 0 # 匹配目标数据的Value顺序(可选) data2 <- data2[match(data2$Value, c(150, 325, 666, 121, 111, 777, 123, 444, 32)), ]
两种方法均可得到需求的结果,其中tidyverse的实现更简洁易读。
内容的提问来源于stack exchange,提问作者cucalorda
相关产品推荐
相关产品推荐

