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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:57:34