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

如何在R语言中堆叠数据框中存在重叠值的不同列

如何在R语言中堆叠数据框中存在重叠值的不同列

嗨,我来帮你搞定这个问题!你想要的其实是把数据框里的多列(y1和y2)转换成单列,同时保留对应的x值——包括那些在不同y列里共享的x(比如x=3同时对应a和b,这两行都要保留),对吧?

先把你的原始数据框再列出来,方便对照:

df <- data.frame(x=c(1,2,3,4), y1=c('a','a','a',NA), y2=c(NA,NA,'b','b'))

方法一:用tidyverse的pivot_longer(推荐)

这是tidyverse生态里最直观的宽转长工具,刚好匹配你的需求。只需要几行代码就能搞定:

library(tidyr)

# 转换格式并过滤NA值
df_long <- df %>%
  pivot_longer(
    cols = c(y1, y2),  # 指定要转换的列是y1和y2
    names_to = NULL,   # 不需要保留原来的列名(y1/y2),所以设为NULL
    values_to = "y"    # 转换后的新列名叫y
  ) %>%
  filter(!is.na(y))    # 去掉y值为NA的无效行

# 看看结果
print(df_long)

运行后你会得到完全符合预期的输出:x=3会同时对应a和b,其他行也都保留了对应的非NA值。

方法二:基础R的reshape函数(不用额外装包)

如果你不想用tidyverse的包,用基础R的reshape函数也能实现:

# 转换宽格式为长格式
df_long_base <- reshape(
  df,
  direction = "long",
  varying = c("y1", "y2"),  # 要转换的列
  v.names = "y",            # 新列名
  idvar = "x",              # 保留x作为标识列,确保x值对应正确
  times = NULL              # 不需要生成时间列
)

# 清理数据:去掉NA行,保留需要的列,重置行名
df_long_base <- df_long_base[!is.na(df_long_base$y), c("x", "y")]
row.names(df_long_base) <- NULL

print(df_long_base)

至于你之前试的bind_rows,它的作用是把多个独立的数据框按行合并,而你现在是在同一个数据框里把多列转成一列,所以用转长格式的函数才是正确的方向哦~

备注:内容来源于stack exchange,提问作者HappyPy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 15:14:32