如何使用R语言将数据框指定列堆叠为单列并保留原始列标识
解决R语言宽数据转长数据的问题
这事儿在R里处理起来超简单,我给你两种实用的方案,先看最常用的tidyverse工具包方法,代码可读性和维护性都很棒:
方法一:使用tidyverse(推荐)
首先确保你已经安装了tidyverse包,如果没安装先执行安装命令,然后加载包,再用pivot_longer函数完成转换:
# 安装tidyverse(如果还没安装的话) # install.packages("tidyverse") library(tidyverse) # 你的原始数据 A <- c(3,5,6,7) B <- c(2,4,5,3) C <- c(4,6,7,8) D <- c(2,4,5,3) gene <- c(1,2,3,4) df <- data.frame(gene,A,B,C,D) # 转换为目标格式 long_df <- df %>% select(-gene) %>% # 移除不需要的gene列 pivot_longer( cols = everything(), # 选中所有剩余的A、B、C、D列 names_to = "sample", # 把原列名存入sample列 values_to = "count" # 把原列的数值存入count列 ) # 查看结果 print(long_df)
执行后你就能得到期望的输出:
count sample 1 3 A 2 5 A 3 6 A 4 7 A 5 2 B 6 4 B 7 5 B 8 3 B 9 4 C 10 6 C 11 7 C 12 8 C 13 2 D 14 4 D 15 5 D 16 3 D
方法二:使用base R(无需额外安装包)
如果你不想安装新包,用base R的reshape函数也能实现,只是代码稍繁琐一点:
# 你的原始数据 A <- c(3,5,6,7) B <- c(2,4,5,3) C <- c(4,6,7,8) D <- c(2,4,5,3) gene <- c(1,2,3,4) df <- data.frame(gene,A,B,C,D) # 转换数据 long_df_base <- reshape( df, direction = "long", varying = list(c("A","B","C","D")), v.names = "count", timevar = "sample", times = c("A","B","C","D") ) # 整理格式,移除冗余列并重置行名 long_df_base <- long_df_base[, c("count", "sample")] row.names(long_df_base) <- NULL # 查看结果 print(long_df_base)
两种方法最终的输出完全一致,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Dswede43
相关产品推荐
相关产品推荐

