2011-10-24 21 views
13

Estoy tratando de analizar una encuesta grande creada con surveymonkey que tiene cientos de columnas en el archivo CSV y el formato de salida es difícil de usar ya que los encabezados se ejecutan en dos líneas.Uso de R para analizar archivos cvsv de Surveymonkey

  • ¿Alguien ha encontrado una forma simple de administrar los encabezados en el archivo CSV para que el análisis sea manejable?
  • ¿Cómo analizan otras personas los resultados de Surveymonkey?

Gracias!

+1

¿Se puede publicar un * pequeño * ejemplo de salida de Surveymonkey que demuestre el problema? Puedo imaginar una solución que usa 'readLines' con' n = 2' para leer (y masajear) los encabezados, y usa 'read.csv' con 'skip = 2, header = FALSE' para obtener solo los datos ... –

+5

La próxima vez que ejecute una encuesta, use LimeSurvey (http://www.limesurvey.org/) - es de código abierto y tiene una instalación de Exportar a R que funciona razonablemente bien (divulgación: escribí el módulo de exportación) – Andrie

+0

@Ben, los encabezados en el archivo son dos líneas nombre/número de la pregunta y luego las preguntas escritas en la línea debajo. En general, un dolor total en el culo para tratar. –

Respuesta

6

Lo que hice en el final era imprimir los encabezados utilizando LibreOffice etiquetados como V1, V2, etc, entonces acabo de leer en el archivo como

m1 <- read.csv('Sheet1.csv', header=FALSE, skip=1) 

y luego acaba de hacer el análisis en contra m1 $ V10 , m1 $ V23 etc ...

para moverse por el lío de varias columnas que utilizó la siguiente función poco

# function to merge columns into one with a space separator and then 
# remove multiple spaces 
mcols <- function(df, cols) { 
    # e.g. mcols(df, c(14:18)) 
     exp <- paste('df[,', cols, ']', sep='', collapse=',') 
     # this creates something like... 
     # "df[,14],df[,15],df[,16],df[,17],df[,18]" 
     # now we just want to do a paste of this expression... 
     nexp <- paste(" paste(", exp, ", sep=' ')") 
     # so now nexp looks something like... 
     # " paste(df[,14],df[,15],df[,16],df[,17],df[,18] , sep='')" 
     # now we just need to parse this text... and eval() it... 
     newcol <- eval(parse(text=nexp)) 
     newcol <- gsub(' *', ' ', newcol) # replace duplicate spaces by a single one 
     newcol <- gsub('^ *', '', newcol) # remove leading spaces 
     gsub(' *$', '', newcol) # remove trailing spaces 
} 
# mcols(df, c(14:18)) 

No hay duda de que alguien será capaz de limpiar esto!

para poner en orden las escalas tipo Likert que utilicé:

# function to tidy c('Strongly Agree', 'Agree', 'Disagree', 'Strongly Disagree') 
tidylik4 <- function(x) { 
    xlevels <- c('Strongly Disagree', 'Disagree', 'Agree', 'Strongly Agree') 
    y <- ifelse(x == '', NA, x) 
    ordered(y, levels=xlevels) 
} 

for (i in 44:52) { 
    m2[,i] <- tidylik4(m2[,i]) 
} 

Siéntase libre de comentar como sin duda esto vendrá de nuevo!

0

Qué tal lo siguiente: use read.csv() con header=FALSE. Haga dos arreglos, uno con las dos líneas de encabezados y el otro con las respuestas a la encuesta. Entonces paste() las dos filas/frases de juntas. Finalmente, use colnames().

+0

Como la segunda línea comienza con caracteres nulos, esto no funcionará, me temo. – Sean

+0

¿Qué tal 'if (! Is.null (second.line)) {paste (first.line, second.line)}'? – power

+1

desafortunadamente hay información útil en la segunda línea, ¡aunque empiece con un carácter nulo! – Sean

10

se puede exportar en una forma conveniente que se adapte a R desde Surveymonkey, ver las respuestas de descarga en 'formato de hoja de avanzada'

surveymonkey export

3

A partir de noviembre de 2013, el diseño de página web parece haber cambiado. Elija Analyze results > Export All > All Responses Data > Original View > XLS+ (Open in advanced statistical and analytical software). Luego vaya a Exportaciones y descargue el archivo. Obtendrá datos brutos como primera fila = encabezados de las preguntas/cada siguiente fila = 1 respuesta, posiblemente dividida entre varios archivos si tiene muchas respuestas/preguntas.

enter image description here

0

El problema con las cabeceras de las columnas es que con "seleccione todas las que se aplican" tendrán una fila superior en blanco y el título de la columna estarán por debajo de la fila. Este es solo un problema para ese tipo de preguntas.

Con esto en mente, me escribió un bucle que pasar por todas las columnas y reemplazar los nombres de columna con el valor de la segunda fila si el nombre de la columna era blank- que tiene una longitud de caracteres de 1.

Entonces , puede matar la segunda fila de datos y tener un marco de datos ordenado.

for(i in 1:ncol(df)){ 
newname <- colnames(df)[i] 
if(nchar(newname) < 2){ 
colnames(df)[i] <- df[1,i] 
} 

df <- df[-1,] 
Cuestiones relacionadas