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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:21:24