R语言如何将数据框中计数列的数值展开为对应行数的观测?
解决方案
方法1:展开分组计数为单婴儿维度观测
你可以直接使用tidyverse生态中tidyr包的uncount()函数完成计数展开,该函数就是专门用于将计数列拆分为对应行数的重复观测:
# 加载tidyverse(如果没有安装先运行install.packages("tidyverse")) library(tidyverse) # 按照Birth列的数值展开行 df_expanded <- df %>% uncount(weights = Birth) # 验证行数,输出为12400 nrow(df_expanded)
如果你不想安装第三方包,也可以用基础R的rep()函数实现同等效果:
df_expanded_base <- df[rep(seq_len(nrow(df)), df$Birth), ] # 不需要保留Birth列的话可以主动删除 df_expanded_base$Birth <- NULL
展开后每一行对应一名独立婴儿,你可以直接用该数据集构建分类模型。
方法2:无需展开的更高效方案(推荐)
你要实现的是二分类概率预测任务,完全不需要额外展开生成12400行数据浪费内存和运算资源,直接用聚合数据拟合加权逻辑回归即可,得到的模型结果和展开后拟合的结果完全一致:
# 拟合二分类逻辑回归模型,将Birth作为行权重传入 gender_model <- glm( Gender ~ Year + Area, data = df, family = binomial(link = "logit"), weights = Birth ) # 预测新样本的男性概率,比如预测2020年CF地区的新生儿性别概率 predict(gender_model, newdata = data.frame(Year = "2020", Area = "CF"), type = "response")
这种方案适合样本量更大的聚合计数场景,运算效率远高于先展开再建模。
内容的提问来源于stack exchange,提问作者Zi Tee
相关产品推荐
相关产品推荐

