合并宽格式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
相关产品推荐
相关产品推荐

