我是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创建了完全相同的代码,它保存了残差,没有错误。如果有人能帮我解决这个问题,我将不胜感激。
答案 0 :(得分:9)
我觉得你的数据中有<meta name="viewport" content="width=device-width, initial-scale=1.0">
个。看看这个例子:
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的行,这些行将被删除,从而导致结果更少。
如果您在na.omit
数据集上运行na.omit
(即代码的最开头是dat
,那么您的代码应该有效。
答案 1 :(得分:0)
这是一个旧线程,但这也许可以帮助其他面临相同问题的人。就LyzandeR的观点而言,检查NA是否是第一道防线。另外,请确保您在x
中没有任何因素,因为这也可能导致错误。