Использование R для анализа CSV-файлов Surveymonkey - PullRequest
15 голосов
/ 25 октября 2011

Я пытаюсь проанализировать большой опрос, созданный с помощью surveymonkey, в котором есть сотни столбцов в файле CSV, а формат вывода сложно использовать, так как заголовки занимают две строки.

  • ИмеетКто-нибудь нашел простой способ управления заголовками в файле CSV, чтобы анализ был управляемым?
  • Как другие люди анализируют результаты Surveymonkey?

Спасибо!

Ответы [ 6 ]

10 голосов
/ 20 апреля 2012

Вы можете экспортировать его в удобной форме, подходящей для R, из Surveymonkey, см. Ответы на загрузку в «Расширенном формате электронных таблиц»

surveymonkey export

6 голосов
/ 27 октября 2011

В итоге я распечатал заголовки, используя libreoffice, помеченный как V1, V2 и т. Д. Затем я просто прочитал в файле как

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

, а затем просто провел анализ против m1 $ V10, m1 $ V23 и т. Д. *

Чтобы обойти беспорядок в нескольких столбцах, я использовал следующую маленькую функцию

# 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))

Без сомнения, кто-нибудь сможет это почистить!

Чтобы привести в порядок шкалы типа Лайкерта, я использовал:

# 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])
}

Не стесняйтесь комментировать, без сомнения, это произойдет снова!

3 голосов
/ 26 ноября 2013

По состоянию на ноябрь 2013 г. макет веб-страницы изменился. Выберите Analyze results > Export All > All Responses Data > Original View > XLS+ (Open in advanced statistical and analytical software). Затем перейдите в Экспорт и загрузите файл. Вы получите необработанные данные в виде первой строки = заголовки вопросов / каждая следующая строка = 1 ответ, возможно, разделенный на несколько файлов, если у вас много ответов / вопросов.

enter image description here

1 голос
/ 25 ноября 2018

Мне приходится иметь дело с этим довольно часто, и заголовки на двух столбцах немного болезненны. Эта функция устраняет эту проблему, так что у вас есть только заголовок в 1 строку для решения. Он также объединяет вопросы с несколькими ответами, поэтому у вас есть название top: bottom.

#' @param x The path to a surveymonkey csv file
fix_names <- function(x) {
  rs <- read.csv(
    x,
    nrows = 2,
    stringsAsFactors = FALSE,
    header = FALSE,
    check.names = FALSE, 
    na.strings = "",
    encoding = "UTF-8"
  )

  rs[rs == ""] <- NA
  rs[rs == "NA"] <- "Not applicable"
  rs[rs == "Response"] <- NA
  rs[rs == "Open-Ended Response"] <- NA

  nms <- c()

  for(i in 1:ncol(rs)) {

    current_top <- rs[1,i]
    current_bottom <- rs[2,i]

    if(i + 1 < ncol(rs)) {
      coming_top <- rs[1, i+1]
      coming_bottom <- rs[2, i+1]
    }

    if(is.na(coming_top) & !is.na(current_top) & (!is.na(current_bottom) | grepl("^Other", coming_bottom)))
      pre <- current_top

    if((is.na(current_top) & !is.na(current_bottom)) | (!is.na(current_top) & !is.na(current_bottom)))
      nms[i] <- paste0(c(pre, current_bottom), collapse = " - ")

    if(!is.na(current_top) & is.na(current_bottom))
      nms[i] <- current_top

  }


  nms
}

Если вы заметили, он возвращает только имена. Обычно я просто читаю .csv с ...,skip=2, header = FALSE, сохраняю переменную и перезаписываю имена переменной. Это также помогает ALOT установить ваши na.strings и stringsAsFactor = FALSE.

nms = fix_names("path/to/csv")
d = read.csv("path/to/csv", skip = 2, header = FALSE)
names(d) = nms 
0 голосов
/ 10 февраля 2016

Проблема с заголовками состоит в том, что столбцы с «выбрать все подходящие» будут иметь пустую верхнюю строку, а заголовок столбца будет следующей строкой. Это проблема только для этих типов вопросов.

Имея это в виду, я написал цикл, чтобы пройти по всем столбцам и заменить имена столбцов значением из второй строки, если имя столбца было пустым, которое имеет длину символа 1.

Затем вы можете убить вторую строку данных и получить аккуратный фрейм данных.

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

df <- df[-1,]
0 голосов
/ 25 октября 2011

Как насчет следующего: используйте read.csv() с header=FALSE. Создайте два массива, один с двумя строчками заголовков и один с ответами на опрос. Затем paste() две строки / предложения вместе. Наконец, используйте colnames().

...