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

合并宽格式mids与长格式数据框后转mids遇行名重复错误求助

解决mice多重插补后合并长格式数据转mids的行名重复问题

问题根源

  • 插补后的长格式数据(completed_wide)中,.id列对应原始宽数据的行号(1-5);合并含time的长数据后,每个原始id对应多行(不同time),导致.id列重复。
  • as.mids()默认使用.id列作为行名,重复的行名触发报错。

解决方案

为合并后的每行生成唯一的.id标识,确保行名不重复,具体步骤如下:

set.seed(123)
library(tidyverse)
library(mice)

# 原始数据
wide <- data.frame(
  id = c(1, 2, 3, 4, 5),
  x = c(1.5, 3, NA, 4.2, 5.8),
  y = c(9.3, NA, 31.7, 41.1, 52.6),
  z = c(101, 198, 305, NA, 499)
)

long <- data.frame(
  id = rep(1:5, each = 2),
  time = rep(1:2, times = 5),
  a = c(10, 15, 20, 25, 50, 30, 35, 40, 30, 45),
  b = c(100, 150, 200, 250, 200, 300, 350, 400, 100, 450)
)

# 多重插补
wide_mids <- mice(data = wide, 
                  m = 5, 
                  printFlag = FALSE)

# 转换为长格式插补数据
completed_wide <- mice::complete(data = wide_mids,
                                 action = "long",
                                 include = TRUE)

# 合并并生成唯一.id
merged <- completed_wide %>%
  left_join(long, by = "id") %>%
  # 按插补分组生成唯一行号作为新的.id
  group_by(.imp) %>%
  mutate(.id = row_number()) %>%
  ungroup()

# 转换为mids对象
merged_mids <- as.mids(merged)

# 验证结果
str(merged_mids)

说明

  • 通过group_by(.imp)后用row_number()生成每个插补组内的唯一行号,确保.id全局唯一,彻底解决行名重复问题。
  • 原始id和time列会被保留,不影响后续对时间序列数据的分析。

内容的提问来源于stack exchange,提问作者jrcalabrese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:06:11