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

如何防护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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:13:31