数据框替换时发生错误,*tmp* 数据有 x 条数据,但要替换的数据有 y 条。

15
我是一名R语言的初学者。这里有一个非常简单的代码,我试图保存残差项:
# Create variables for child's EA:

dat$cldeacdi <- rowMeans(dat[,c('cdcresp', 'cdcinv')],na.rm=T)
dat$cldeacu <- rowMeans(dat[,c('cucresp', 'cucinv')],na.rm=T)

# Create a residual score for child EA:

dat$cldearesid <- resid(lm(cldeacu ~ cldeacdi, data = dat))

我收到了以下信息:

Error in `$<-.data.frame`(`*tmp*`, cldearesid, value = c(-0.18608488908881,  : 
  replacement has 366 rows, data has 367

我搜索了这个错误,但找不到任何能解决这个问题的方法。此外,我为妈妈的EA创建了完全相同的代码,它很好地保存了残差,并且没有出现任何错误。如果有人能帮我解决这个问题,我会非常感激。

2个回答

17

我感觉你的数据里有 NA。看这个例子:

#mtcars data set
test <- mtcars
#adding just one NA in the cyl column
test[2, 2] <- NA

#running linear model and adding the residuals to the data.frame
test$residuals <- resid(lm(mpg ~ cyl, test))
Error in `$<-.data.frame`(`*tmp*`, "residuals", value = c(0.382245430809409,  : 
  replacement has 31 rows, data has 32

你可以看到,这导致了一个类似于你遇到的错误。

作为验证:

length(resid(lm(mpg ~ cyl, test)))
#31
nrow(test)
#32

这是因为在运行回归之前,lm会对数据集运行na.omit函数,所以如果你的数据集中有任何具有NA值的行,它们将被删除,导致结果变少。

如果在代码开头使用na.omit函数来处理dat数据集(即dat < - na.omit(dat)),那么你的代码应该可以正常工作。


其实,我刚刚注意到当我运行na.omit时,它会清除我的数据集,也就是说 - 我的变量观测值为0...这是为什么? - Marishka Usacheva
2
na.omit 会从数据框中删除完整的行,如果该行中至少有一列带有 NAlm 也会这样做,因为它在内部调用了 na.omit。在运行 na.omit 之前,请确保在回归中排除您不需要的列。 - LyzandeR

3

这是一个旧的帖子,但或许能够帮助面对相同问题的其他人。根据LyzandeR所说,第一步应该检查是否有NA值。此外,还要确保在x中没有任何因素,因为这也可能导致错误。


嗨Dawson,如果我的x有18个因子,是不是太多了?如果太多了该怎么办?我觉得教程和我有相同的因子。 - hua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接