[R] adding factor scores back to an incomplete dataset...

Phil Spector spector at stat.berkeley.edu
Tue Aug 25 23:40:13 CEST 2009

David -
    Here's the easiest way I've been able to come up with. 
I'll provide some sample data to make things clearer (hint, hint):

> dat = data.frame(matrix(rnorm(100),20,5))
> dat[3,4] = NA
> dat[12,3] = NA
> scrs = factanal(na.omit(dat),factors=2,scores='regression')$scores
> rownames(scrs) = rownames(na.omit(dat))
> newdat = merge(dat,scrs,by=0,all.x=TRUE,sort=FALSE)

This will result in the observations with missing values being
at the end of the data frame.  If you want the original order
(assuming default row names), you could use


A somewhat more complicated approach is, in some sense, more direct:

> dat$Factor1 = NA
> dat$Factor2 = NA
> dat[rownames(na.omit(dat[,-c(6,7)])),c('Factor1','Factor2')] = 
+    factanal(na.omit(dat[,-c(6,7)]),factors=2,scores='regression')$scores

The order of the data is preserved.
 					- Phil Spector
 					 Statistical Computing Facility
 					 Department of Statistics
 					 UC Berkeley
 					 spector at stat.berkeley.edu

On Tue, 25 Aug 2009, David G. Tully wrote:

> I am sure there is a simple way to do the following, but i haven't been able 
> to find it. I am hoping a merciful soul on R-help could point me in the right 
> direction.
> I am doing a factor analysis on survey data with missing values. to do this, 
> I run:
> FA1<-factanal(na.omit(DATA), factors = X, rotation = 'oblimin', scores = 
> 'regression')
> Now that I have my factors and factor scores, I want to add those scores back 
> to my original dataset so I can plot factor scores by demographics. However, 
> when I try to add the scores back to the original data frame, the variables 
> are of different lengths.
> Is there a way to subset from my original data set that will work with 
> factanal() and preserve the original rows or that will allow me to append the 
> factor scores back onto the original dataset with the proper rows and NAs 
> where there could be no data?
> Again, I apologize if I am missing something basic. I am a self taught R user 
> and couldn't find an answer to this question.
> Thanks in advance,
>  David
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

More information about the R-help mailing list