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

