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

