R语言合并3个宽表失败求助:合并结果不符合预期
解决三个数据框合并为宽表的问题
你的合并操作未达预期的核心原因是:三个数据框的game_part字段值无重叠匹配项——dat_hr_test的game_part前缀为hr_,dat_sbp_test为sbp_,dat_dbp_test为dbp_,以此作为合并键时无法找到匹配行,自然生成不了预期的宽表结构。
以下是两种直接可行的解决方案:
方案1:统一分组标识后合并
先从每个数据框的game_part中提取共同的会话标识(去除前缀),再按id2和统一后的标识合并:
library(dplyr) library(stringr) # 清洗每个数据框,提取统一会话标识 dat_hr_clean <- dat_hr_test %>% mutate(session = str_remove(game_part, "^hr_")) %>% select(-game_part) dat_sbp_clean <- dat_sbp_test %>% mutate(session = str_remove(game_part, "^sbp_")) %>% select(-game_part) dat_dbp_clean <- dat_dbp_test %>% mutate(session = str_remove(game_part, "^dbp_")) %>% select(-game_part) # 逐步合并得到宽表 merged_wide <- dat_hr_clean %>% inner_join(dat_sbp_clean, by = c("id2", "session")) %>% inner_join(dat_dbp_clean, by = c("id2", "session"))
方案2:先纵向合并再转宽表(更简洁)
先将三个数据框按行合并为长表,再转换为宽表,适配当前数据结构:
library(dplyr) library(tidyr) library(stringr) # 纵向合并三个数据框,标记指标类型 combined_long <- bind_rows( dat_hr_test %>% mutate(metric = "hr"), dat_sbp_test %>% mutate(metric = "sbp"), dat_dbp_test %>% mutate(metric = "dbp") ) # 转换为宽表,可选择保留会话标识 merged_wide <- combined_long %>% mutate(session = str_remove(game_part, "^[a-z]+_")) %>% pivot_wider( id_cols = c(id2, session), names_from = metric, values_from = c(hr, sbp, dbp), values_drop_na = TRUE ) # 若无需会话标识,直接按id2转宽 merged_wide_simple <- combined_long %>% pivot_wider( id_cols = id2, names_from = metric, values_from = c(hr, sbp, dbp), values_drop_na = TRUE )
运行上述代码后,将得到每行对应一个id2,包含hr、sbp、dbp三个指标的宽表,完全匹配预期需求。
内容的提问来源于stack exchange,提问作者jtjtjtjt
相关产品推荐
相关产品推荐

