如何防护R代码避免行数不匹配错误,按不同ntile自动补NA
解决R中不同分位数分组统计合并时的行数不匹配问题
问题原因
你遇到的Error in data.frame(...) : arguments imply differing number of rows: 5, 4错误,本质是身高、体重按5分位数分组得到5行统计结果,而就诊次数按4分位数只有4行,直接合并时行数不匹配导致的。要实现自动为缺失分组填充NA,不需要手动分开合并,通过对齐分组键的方式就能统一处理。
解决方案(dplyr + tidyr 实现)
先模拟一份测试数据,再分步处理:
set.seed(123) # 固定随机种子,结果可复现 df <- data.frame( patient_id = 1:100, gender = sample(c("M", "F"), 100, replace = TRUE), identity = sample(c("inpatient", "outpatient"), 100, replace = TRUE), height = rnorm(100, 170, 10), weight = rnorm(100, 65, 8), visit_count = sample(1:20, 100, replace = TRUE), disease_status = sample(c("yes", "no"), 100, replace = TRUE) ) library(dplyr) library(tidyr) # 1. 处理身高、体重的5分位数统计,统一分组列名为quantile_group height_weight_stats <- df %>% mutate(quantile_group = ntile(height, 5)) %>% # 用身高的5分位数作为统一分组(和体重的5分位数分组逻辑一致) group_by(quantile_group) %>% summarise( height_min = min(height), height_max = max(height), weight_min = min(weight), weight_max = max(weight) ) # 2. 处理就诊次数的4分位数统计 visit_stats <- df %>% mutate(quantile_group = ntile(visit_count, 4)) %>% group_by(quantile_group) %>% summarise( visit_min = min(visit_count), visit_max = max(visit_count) ) # 3. 全连接合并,自动补全缺失分组的NA值 final_table <- full_join(height_weight_stats, visit_stats, by = "quantile_group") %>% arrange(quantile_group)
Base R 实现(无需额外包)
如果不想用tidyverse包,用base R也能实现:
# 1. 生成身高、体重的5分位数统计 hw_quantile <- ntile(df$height, 5) height_res <- tapply(df$height, hw_quantile, function(x) c(min = min(x), max = max(x))) weight_res <- tapply(df$weight, hw_quantile, function(x) c(min = min(x), max = max(x))) hw_df <- data.frame( quantile_group = 1:5, do.call(rbind, height_res), do.call(rbind, weight_res) ) names(hw_df)[2:5] <- c("height_min", "height_max", "weight_min", "weight_max") # 2. 生成就诊次数的4分位数统计 visit_quantile <- ntile(df$visit_count, 4) visit_res <- tapply(df$visit_count, visit_quantile, function(x) c(min = min(x), max = max(x))) visit_df <- data.frame( quantile_group = 1:4, do.call(rbind, visit_res) ) names(visit_df)[2:3] <- c("visit_min", "visit_max") # 3. 合并并排序,自动补NA final_table_base <- merge(hw_df, visit_df, by = "quantile_group", all = TRUE) final_table_base <- final_table_base[order(final_table_base$quantile_group), ]
关键逻辑
不管用哪种方法,核心都是先为每个统计结果添加统一的分组列,再通过全连接(full_join或merge(all=TRUE))让R自动对齐分组,缺失的分组对应的统计值会自动填充为NA,不需要手动处理。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

