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

为何出现‘Replacement has 2287 rows, data has 2490’报错?

问题原因及解决办法

报错原因

你遇到的行数不匹配问题,核心原因是线性回归模型lm()会自动剔除包含缺失值(NA)的观测:

  • 你的df.Part3原始有2490行,但其中部分行存在缺失值(比如SALE_PRICE、YEAR_BUILT等变量里有NA),lm()运行时会自动删掉这些行,最终参与回归的只有2287行,所以z$residuals的长度是2287。
  • 当你试图把2287行的残差赋值给有2490行的df.Part3时,行数不匹配就触发了报错。

解决办法

方法1:提前删除缺失值

先把df.Part3里的缺失值行删掉,再做回归,这样残差行数就和数据框行数一致了:

df.Part3 <- df %>%  
  filter(NEIGHBORHOOD_NAME=="BRONXDALE",YEAR>2008,SALE_PRICE>0)%>%  
  mutate(TOTAL_UNITS=RESIDENTIAL_UNITS+COMMERCIAL_UNITS)%>%  
  mutate(SALE_YEAR=year(SALE_DATE))%>%  
  ungroup()%>%  
  select(SALE_PRICE,SALE_YEAR,YEAR_BUILT,GROSS_SQUARE_FEET,TOTAL_UNITS,TYPE) %>%
  drop_na() # 新增:删除所有含NA的行

z <- lm(formula=SALE_PRICE~.,data=df.Part3) 
summary(z)

df.Part3["residuals"] <- z$residuals

方法2:用broom包的augment函数(保留所有行)

如果不想删除原始行,想保留所有观测(缺失值对应的残差设为NA),可以用broom包的augment()函数,它会直接把残差等回归结果合并到原数据框:

library(broom)

df.Part3 <- df %>%  
  filter(NEIGHBORHOOD_NAME=="BRONXDALE",YEAR>2008,SALE_PRICE>0)%>%  
  mutate(TOTAL_UNITS=RESIDENTIAL_UNITS+COMMERCIAL_UNITS)%>%  
  mutate(SALE_YEAR=year(SALE_DATE))%>%  
  ungroup()%>%  
  select(SALE_PRICE,SALE_YEAR,YEAR_BUILT,GROSS_SQUARE_FEET,TOTAL_UNITS,TYPE)

z <- lm(formula=SALE_PRICE~.,data=df.Part3) 
summary(z)

df.Part3 <- augment(z, data = df.Part3)
# 此时df.Part3会新增.resid列,就是残差,所有原始行都保留,缺失值对应的.resid为NA

内容的提问来源于stack exchange,提问作者Thanos of Siberia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:55:17