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

如何用Base R将ID关联的多列临床条件转换为多行数据?

使用Base R实现宽表转长表的解决方案

首先构造与你提供的原始数据一致的数据框:

df <- data.frame(
  ID = c(2345, 2346, 2347, 2348),
  `clinical condition 1` = c("depression", "Tuberculosis", "cancer", "Flu"),
  `clinical condition 2` = c("dementia", NA, NA, "dementia"),
  stringsAsFactors = FALSE
)

方法一:使用reshape()函数(Base R原生重塑工具)

这是Base R中专门处理数据宽长转换的函数,代码简洁高效:

# 将宽表转为长格式
long_df <- reshape(
  df,
  direction = "long",          # 指定转换方向为长表
  varying = c("clinical condition 1", "clinical condition 2"),  # 需要合并的列
  v.names = "clinical condition 1",  # 合并后的列名
  idvar = "ID",                # 保留的分组ID列
  times = NULL                 # 不需要生成时间/类型列,设为NULL
)

# 过滤缺失值并保留所需列
long_df <- long_df[!is.na(long_df$`clinical condition 1`), c("ID", "clinical condition 1")]

# 重置行名(可选,让输出更整洁)
rownames(long_df) <- NULL

运行后得到的long_df即为目标格式:

ID clinical condition 1
1 2345           depression
2 2345             dementia
3 2346        Tuberculosis
4 2347               cancer
5 2348                  Flu
6 2348             dementia

方法二:使用stack()结合cbind()手动转换

如果想更直观地理解转换过程,可以用这种方式:

# 将两个临床条件列堆叠成一列
condition_stack <- stack(df[, c("clinical condition 1", "clinical condition 2")])

# 重复ID列并与堆叠后的条件列结合
long_df2 <- cbind(
  ID = rep(df$ID, 2),
  `clinical condition 1` = condition_stack$values
)

# 过滤缺失值
long_df2 <- long_df2[!is.na(long_df2$`clinical condition 1`), ]

# 转换为数据框(可选,默认cbind输出为矩阵)
long_df2 <- as.data.frame(long_df2, stringsAsFactors = FALSE)

这个方法的输出结果和方法一完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:05:30