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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:30:45