使用dplyr处理数据集:同个体tpens求和及合并后回归问题
合并数据集与回归分析问题排查
问题背景
现有两个数据集data和allb,共同标识变量为nquest(家庭编码)和nord(家庭成员序号)。核心需求:
- 按
nquest+nord分组,对allb中同一家庭成员的tpens值求和,求和时将NA替换为0 - 将处理后的
allb与data内连接,再执行线性回归lm(log(tpens) ~ sex + eta + ireg + studio, data = final)
遇到的问题
- 最初尝试代码时报错
object 'tpens' not found,改用summarise完成分组求和、重命名列并与data内连接后得到final数据集 - 执行回归时触发报错
NA/NaN/Inf in 'y',排查发现处理后的allb2$tpens最小值为0,但原allb中tpens最小值是103——log(0)无意义,这是回归报错的直接原因
数据集样本
data样本
nquest nord sex anasc ireg eta staciv studio asnonoc nace nesplav exlav etalav 173 1 1 1948 18 64 3 5 4 19 1 NA 23 375 1 2 1925 16 87 4 2 1 7 1 NA 35 629 1 1 1939 5 73 4 3 1 3 1 NA 15 ...
allb样本
nquest nord tpens 173 1 2500 375 1 409 629 1 1188 629 1 NA 629 1 181 ...
原因分析与解决办法
原因
处理后出现tpens=0,本质是存在某个家庭成员的所有tpens记录全为NA:当把NA替换为0后,该分组的求和结果就是0。原allb的最小值103是单个非NA值,但全NA分组的存在导致了求和后出现0值。
解决办法
方案1:过滤tpens=0的样本
如果业务上认为tpens=0的样本无分析价值,可在回归前直接过滤:
final_filtered <- final[final$tpens > 0, ] lm(log(tpens) ~ sex + eta + ireg + studio, data = final_filtered)
方案2:对tpens做偏移处理
若需保留这些样本,可给tpens加一个极小的正数(比如1),避免log(0)的问题:
final$tpens_adj <- final$tpens + 1 lm(log(tpens_adj) ~ sex + eta + ireg + studio, data = final)
注:偏移量需结合业务逻辑选择,尽量不影响数据整体趋势
方案3:修正分组求和逻辑
如果业务上认为全NA的分组应该保留为NA而非0,可调整求和代码:
library(dplyr) allb2 <- allb %>% group_by(nquest, nord) %>% summarise(tpens = sum(tpens, na.rm = FALSE)) %>% # 全NA时求和结果为NA ungroup() # 后续合并后,可删除NA样本再回归 final_clean <- final[!is.na(final$tpens), ] lm(log(tpens) ~ sex + eta + ireg + studio, data = final_clean)
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

