2012-08-24 12 views
5

Definición del problema: exportar una versión ordenada de un objeto de clase "cargas"¿Cómo exporto una tabla de carga de factores ordenados?

Después de ejecutar un análisis factorial con el fa -función del psych-paquete, consigo una tabla de factores de cargas a que se parece a la se muestra aquí:

Loadings: 
     Factor1 Factor2 Factor3 
TH_Q1  0.173 0.548 0.403 
TH_Q2  0.306 0.291 0.825 
TH_Q3  0.334 0.203 0.825 
TH_Q4  0.262 0.536 0.171 
TH_Q5  0.235 0.686   
TH_Q6  0.125 0.836   
TH_Q7  0.200 0.838   
TH_Q8_A1       
TH_Q8_A2   0.155   
TH_Q9  0.644 0.133 0.171 
TH_Q10 0.608 0.208 0.157 
TH_Q11 0.569 0.161 0.306 
TH_Q12 0.722   0.127 
TH_Q13 0.661 0.311   
TH_Q14 0.562 0.407   
TH_Q15 0.675 0.422   

Después de ejecutar la función print en esta tabla (que se almacena en la variable f.loadings), me sale una tabla ordenada print(f.loadings, digits=2, cutoff=.3, sort=TRUE):

Loadings: 
     Factor1 Factor2 Factor3 
TH_Q9  0.64     
TH_Q10 0.61     
TH_Q11 0.57   0.31 
TH_Q12 0.72     
TH_Q13 0.66 0.31   
TH_Q14 0.56 0.41   
TH_Q15 0.68 0.42   
TH_Q1    0.55 0.40 
TH_Q4    0.54   
TH_Q5    0.69   
TH_Q6    0.84   
TH_Q7    0.84   
TH_Q2  0.31   0.82 
TH_Q3  0.33   0.83 
TH_Q8_A1       
TH_Q8_A2       

print sin embargo, devuelve una copia "invisible" del objeto, por lo que no puedo exportar este resultado en el formato solicitado. Sin embargo, me gustaría encontrar una forma de exportar una versión .csv de esta tabla.

No pude encontrar la manera de especificar los parámetros de write.csv para hacer una clasificación correcta de un objeto de clase "cargando". Asignar el resultado de la función de impresión tampoco soluciona esto, ya que solo devuelve la versión sin clasificar. Por lo tanto, x <- print(f.loadings, digits=2, cutoff=.3, sort=TRUE) y posteriormente solicitando la nueva variable x, aún devuelve la versión no ordenada de la tabla.

¿Qué función sería adecuada para ordenar un objeto "cargas" y devolver este objeto visiblemente? En otras palabras, ¿cómo puedo exportar una tabla ordenada?

código para generar la tabla:

f.loadings <- structure(c(0.172693322885797, 0.306277415972136, 0.334012445825371, 
0.261822356615649, 0.234600824098634, 0.124541887813939, 0.200125976802047, 
0.0199775267669519, 0.0771905784767979, 0.643886342785064, 0.608004298828405, 
0.569498016145868, 0.722454442131503, 0.660683752725898, 0.561975379133291, 
0.675119271585253, 0.548184083921831, 0.291215413974386, 0.20334622551054, 
0.535545380240845, 0.685635981787823, 0.836401389336655, 0.837525597359627, 
0.0186113870539496, 0.154659865540958, 0.132908227837058, 0.20832344061795, 
0.160657979843522, 0.0933961709813049, 0.311465272208257, 0.406860675137862, 
0.421946817384512, 0.402664774610544, 0.824934582975472, 0.825220077707656, 
0.170809720550637, -0.0486225264368695, 0.0612401518170266, 0.052596915030506, 
-0.0463868732056794, 0.0208945338424677, 0.171412077700389, 0.156524506151013, 
0.306203004564158, 0.127377474768802, -0.0869197819037828, -0.0962274476959987, 
-0.0465278761105364), .Dim = c(16L, 3L), .Dimnames = list(c("TH_Q1", "TH_Q2", "TH_Q3", "TH_Q4", "TH_Q5", "TH_Q6", "TH_Q7", "TH_Q8_A1", "TH_Q8_A2", "TH_Q9", "TH_Q10", "TH_Q11", "TH_Q12", "TH_Q13", "TH_Q14", "TH_Q15"), c("Factor1", "Factor2", "Factor3")), class = "loadings") 

Respuesta

4

Así es cómo puede hackear el método de impresión predeterminado para loadings. He asignado la declaración de impresión al newx y exporté eso. Cuando asigna el resultado printLoadings a una variable, tiene su objeto ordenado a su disposición. El resultado ahora es una tabla de personajes. Te lo dejaré como ejercicio para convertirlo en numérico.

> getS3method("print","loadings") #get the hidden method and modify it 
printLoadings <- function (x, digits = 3, cutoff = 0.1, sort = FALSE, ...) 
{ 
    Lambda <- unclass(x) 
    p <- nrow(Lambda) 
    factors <- ncol(Lambda) 
    if (sort) { 
     mx <- max.col(abs(Lambda)) 
     ind <- cbind(1L:p, mx) 
     mx[abs(Lambda[ind]) < 0.5] <- factors + 1 
     Lambda <- Lambda[order(mx, 1L:p), ] 
    } 
    cat("\nLoadings:\n") 
    fx <- format(round(Lambda, digits)) 
    names(fx) <- NULL 
    nc <- nchar(fx[1L], type = "c") 
    fx[abs(Lambda) < cutoff] <- paste(rep(" ", nc), collapse = "") 
    newx <- print(fx, quote = FALSE, ...) # I assigned this to a variable 
    vx <- colSums(x^2) 
    varex <- rbind(`SS loadings` = vx) 
    if (is.null(attr(x, "covariance"))) { 
     varex <- rbind(varex, `Proportion Var` = vx/p) 
     if (factors > 1) 
     varex <- rbind(varex, `Cumulative Var` = cumsum(vx/p)) 
    } 
    cat("\n") 
    print(round(varex, digits)) 
    invisible(newx) #previously returned x 
} 

mmm <- printLoadings(f.loadings) 
> str(mmm) 
chr [1:16, 1:3] " 0.173" " 0.306" " 0.334" " 0.262" " 0.235" ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:16] "TH_Q1" "TH_Q2" "TH_Q3" "TH_Q4" ... 
    ..$ : chr [1:3] "Factor1" "Factor2" "Factor3" 

> as.table(mmm) 
     Factor1 Factor2 Factor3 
TH_Q1  0.173 0.548 0.403 
TH_Q2  0.306 0.291 0.825 
TH_Q3  0.334 0.203 0.825 
TH_Q4  0.262 0.536 0.171 
+0

Gracias! No sabía 'getS3method' y me perdí al buscar funciones en métodos (imprimir). ¡Será realmente útil en el futuro también! – smoens

1

Cuando una función devuelve sus resultados con invisible() simplemente significa que los resultados no se imprimen. Sin embargo, aún puede asignar los resultados a una variable y manipularla como cualquier otro objeto.

Así:

x <- print(f.loadings) 
x 
Loadings: 
     Factor1 Factor2 Factor3 
TH_Q1  0.173 0.548 0.403 
TH_Q2  0.306 0.291 0.825 
TH_Q3  0.334 0.203 0.825 
TH_Q4  0.262 0.536 0.171 
TH_Q5  0.235 0.686   
TH_Q6  0.125 0.836   
TH_Q7  0.200 0.838   
TH_Q8_A1       
TH_Q8_A2   0.155   
TH_Q9  0.644 0.133 0.171 
TH_Q10 0.608 0.208 0.157 
TH_Q11 0.569 0.161 0.306 
TH_Q12 0.722   0.127 
TH_Q13 0.661 0.311   
TH_Q14 0.562 0.407   
TH_Q15 0.675 0.422   

       Factor1 Factor2 Factor3 
SS loadings  3.259 3.145 1.747 
Proportion Var 0.204 0.197 0.109 
Cumulative Var 0.204 0.400 0.509 

Similarmente, str(x) indica los resultados es una matriz:

str(x) 
loadings [1:16, 1:3] 0.173 0.306 0.334 0.262 0.235 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:16] "TH_Q1" "TH_Q2" "TH_Q3" "TH_Q4" ... 
    ..$ : chr [1:3] "Factor1" "Factor2" "Factor3" 

Ahora puede utilizar write.csv(x) para exportar los resultados.

+0

Mis disculpas ... debería haber especificado esta en la pregunta ... He intentado esto, pero si funciono con el comando 'x <- impresión (f.loadings, dígitos = 2, de corte = .3, sort = TRUE) 'y posteriormente pide la nueva variable x, devuelve la versión no ordenada de la tabla nuevamente. – smoens

0

Pruebe la función fa.sort en lugar de ordenar en la función de impresión.

Es decir, si f < - FA (Thurstone, 3) se puede imprimir (f, ordenados = VERDADERO), que no hace copias, pero no devuelve el objeto ordenada, o fs < - FA. sort (f) que devuelve el objeto ordenado que luego puede exportar como un csv.

Bill

Cuestiones relacionadas