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

拆分ID列并重塑R数据框:解决spread()生成NA的问题

解决R语言数据框拆分与格式转换问题

原始数据

给定的原始数据框如下:

data = data.frame(
  ID = c('101 1h','101 2h','101 3h','102 1h','102 2h','102 3h'),
  marker1 = c(1,1,2,2,2,3),
  marker2 = c(3,3,4,5,5,6)
)

问题分析

你需要把合并的ID列拆分为独立的编号(如101)和阶段(如1h)列,最终每行对应一个编号的单个阶段,同时保留对应阶段的marker1和marker2值。之前先用separate()拆分ID列后误用spread()导致其他阶段列出现NA,是因为spread()是将长格式转为宽格式,和你需要的单阶段每行的需求不符,改用gather()(或仅拆分ID列)才是正确方向。

解决方案

1. 加载依赖包

首先加载tidyverse,它包含dplyr和tidyr,提供separate()、gather()等所需函数:

library(tidyverse)

2. 拆分ID列

用separate()把合并的ID列拆分为ID(编号)和phase(阶段)两列,这一步就能得到你想要的基础格式:

data_split <- data %>%
  separate(ID, into = c("ID", "phase"), sep = " ")

执行后data_split的结构如下:

IDphasemarker1marker2
1011h13
1012h13
1013h24
1021h25
1022h25
1023h36

3. 可选:转换为标记物的长格式

如果后续需要把marker1和marker2统一为长格式(比如合并成biomarker和value列),再用gather()处理:

data_long <- data_split %>%
  gather(key = "biomarker", value = "value", marker1, marker2)

转换后结果示例:

IDphasebiomarkervalue
1011hmarker11
1012hmarker11
1013hmarker12
1021hmarker12

为什么spread()会产生NA?

spread()的作用是把长格式中某一列的不同值转为宽格式的列,比如你如果错误地用它处理phase列:

# 错误示例,会生成大量NA
data_wide <- data_split %>%
  spread(key = phase, value = c(marker1, marker2))

这会生成1h_marker1、2h_marker1等列,但每个ID行只有对应阶段的数值,其他阶段自然都是NA——完全不符合你单阶段每行的需求,所以会出现问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:35:33