R语言合并列名不同的两个数据框并执行melt长表转换的方法
R数据框合并转长表解决方案
方案1:tidyverse实现(推荐,代码易维护)
首先安装并加载依赖包:
install.packages("tidyverse") library(tidyverse)
处理并合并数据框代码:
# 处理df1为目标长表结构 df1_long <- df1 %>% rename(sum = weight) %>% mutate(var = "weight") %>% select(treatment, var, sum, sd) # 处理df2为目标长表结构,先统一列名 df2_long <- df2 %>% rename( treatment = treatment2, sum = area, sd = sd2 ) %>% mutate(var = "area") %>% select(treatment, var, sum, sd) # 合并两个长表得到最终结果 final_df <- bind_rows(df1_long, df2_long)
如果单个数据框内有多个测量变量,可使用pivot_longer通用写法适配更多场景:
df1_long <- df1 %>% pivot_longer(cols = weight, names_to = "var", values_to = "sum") %>% select(treatment, var, sum, sd) df2_long <- df2 %>% rename(treatment = treatment2, sd = sd2) %>% pivot_longer(cols = area, names_to = "var", values_to = "sum") %>% select(treatment, var, sum, sd) final_df <- bind_rows(df1_long, df2_long)
方案2:base R实现(无需额外依赖)
无需安装任何第三方包,直接用R原生函数实现:
# 处理df1为目标结构 df1_long <- data.frame( treatment = df1$treatment, var = "weight", sum = df1$weight, sd = df1$sd ) # 处理df2为目标结构 df2_long <- data.frame( treatment = df2$treatment2, var = "area", sum = df2$area, sd = df2$sd2 ) # 合并两个数据框 final_df <- rbind(df1_long, df2_long)
最终结果示例
两种方案输出的结果完全一致,符合要求的结构:
| treatment | var | sum | sd |
|---|---|---|---|
| control | weight | 0.01872556 | 0.008540041 |
| noise | weight | 0.01575400 | 0.007460524 |
| control | area | 0.79809444 | 0.337949414 |
| noise | area | 0.68014667 | 0.294295847 |
内容的提问来源于stack exchange,提问作者GIS_newbie
相关产品推荐
相关产品推荐

