разбиение разделенных пробелами записей на новые столбцы в R - PullRequest
2 голосов
/ 21 июля 2010

Я кодирую опрос, который выводит файл .csv.В этом CSV у меня есть некоторые записи, разделенные пробелами, которые представляют собой вопросы с несколькими вариантами ответов (например, вопросы с более чем одним ответом).В конце я хочу разобрать эти разделенные пробелами записи в их собственные столбцы и создать для них заголовки, чтобы я знал, откуда они пришли.

Например, я могу начать с этого (обратите внимание, что столбцы множественного выбора имеют после них _M):

Q1, Q2_M, Q3, Q4_M
6, 1 2 88, 3, 3 5 99
6, , 3, 1 2

, и я хочу перейти к этому:

Q1, Q2_M_1, Q2_M_2, Q2_M_88, Q3, Q4_M_1, Q4_M_2, Q4_M_3, Q4_M_5, Q4_M_99
6, 1, 1, 1, 3, 0, 0, 1, 1, 1
6,,,,3,1,1,0,0,0

Я полагаю, что это довольно распространенная проблема, но я не смог найти ее в разделе R.Любые идеи, как сделать это в R после импорта .csv?Мои общие мысли (которые часто приводят к неэффективным программам) состоят в том, что я могу: (1) извлечь номера столбцов со специальным суффиксом с помощью grep () (2) пройти (или использовать команду apply) каждую из записей в этих столбцах иопределить уровни ответов, а затем создать соответствующие столбцы (3) пройтись по циклу (или использовать приложение) и поместить индикаторы в соответствующие столбцы, чтобы указать наличие выбора

Я ценю любую помощь и, пожалуйста, дайте мне знать, если этоне ясно.

Ответы [ 4 ]

2 голосов
/ 21 июля 2010

Я согласен с ran2 и aL3Xa, что вы, вероятно, хотите изменить формат ваших данных, чтобы иметь разные столбцы для каждого возможного ответа. Однако, если ваш набор данных в лучшем формате окажется проблематичным, можно сделать то, что вы просили.

process_multichoice <- function(x) lapply(strsplit(x, " "), as.numeric)

q2 <- c("1 2 3 NA 4", "2 5")
processed_q2 <- process_multichoice(q2)
[[1]]
[1]  1  2  3 NA  4

[[2]]
[1] 2 5

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

# Number of reponses given
sapply(processed_q2, length)

#Frequency of each response
table(unlist(processed_q2), useNA = "ifany")

РЕДАКТИРОВАТЬ: еще один совет. Храните код, который обрабатывает ваши данные отдельно от кода, который их анализирует. Если вы создаете какие-либо графики, держите код для их создания снова отдельно. Я был на пути смешивания вещей, и это не красиво. (Особенно, когда вы вернетесь к коду через шесть месяцев.)

1 голос
/ 21 июля 2010

Элементы с множественным выбором всегда должны кодироваться как отдельные переменные.То есть, если у вас есть 5 альтернатив и множественный выбор, вы должны кодировать их как i1, i2, i3, i4, i5 , то есть каждый из них является двоичной переменной (0-1).Я вижу, что у вас есть значения 3 5 99 для Q4_M переменной в первом примере.Значит ли это, что у вас есть 99 альтернатив в предмете?Ой ...

Сначала вы должны создать отдельные переменные для каждой альтернативы в элементе множественного выбора.То есть выполните:

# note that I follow your example with Q4_M variable
dtf_ins <- as.data.frame(matrix(0, nrow = nrow(<initial dataframe>), ncol = 99))
# name vars appropriately
names(dtf_ins) <- paste("Q4_M_", 1:99, sep = "")

, теперь у вас есть data.frame с 0s, поэтому вам нужно получить 1s в соответствующей позиции (это немного громоздко), функция сделаетзадание ...

# first you gotta change spaces to commas and convert character variable to a numeric one
y <- paste("c(", gsub(" ", ", ", x), ")", sep = "")
z <- eval(parse(text = y))
# now you assing 1 according to indexes in z variable
dtf_ins[1, z] <- 1

И это в значительной степени все ... в основном, вы хотели бы пересмотреть создание data.frame с _M переменными, чтобы вы могли написать функциюэто делает эту вставку автоматически.Избегайте циклов for!

Или, что еще лучше, создайте матрицу с логикой, и просто выполните dtf[m] <- 1, где dtf - ваш файл данных с несколькими вариантами выбора и m - это матрица с логикой.

Я бы хотел помочь вам в этом, но я выздоравливаю после долгой ночи!=) Надеюсь, я немного помог!=) * * Один тысяча двадцать-шесть

1 голос
/ 21 июля 2010

Я не совсем уверен, что вы пытаетесь сделать, соответственно, каковы ваши причины для такого кодирования.Таким образом, мой совет носит более общий характер, поэтому просто уточните, и я постараюсь дать более конкретный ответ.

1) Я говорю, что вы сами кодируете опрос, и это здорово, потому что это означает, что вы имеете влияние на свой файл .csv.Я НИКОГДА не использовал бы разные виды разделения в одном и том же файле .csv.Просто сделайте наименование с самого начала, как вы предложили во втором блоке.В противном случае вы можете столкнуться с проблемами с флажками, например.Допустим, кто-то проверяет 3 из 5 возможных ответов, следующий проверяет только 1 (то есть «не знаю»).Теперь будет намного сложнее создать представление результатов в виде электронной таблицы (data.frame), а не пустое поле (которое в NA оказывается NA), которое нужно только перекодировать.

2) Еще один важный вопрос: намереваетесь ли вы провести групповое обследование (т. Е. Продольное исследование с повторным опросом одних и тех же участников).Это (среди многих других) было бы хорошим поводом подумать о сохранении ваших данных в базе данных MySQL вместо .csv.RMySQL может подключаться напрямую к базе данных и получать доступ к ее таблицам и, что более важно, к своим ПРОСМОТРАМ.Представления действительно помогают с данными опроса, так как вы можете перегруппировать данные в разных представлениях, при условии, что это зависит от множества различных потребностей.

3) Помимо всего личного / мнения и опыта, вот некоторая (менее предвзятая) литература для начала: Комплексные опросы: руководство по анализу с использованием R (серия Wiley в методологии опроса

Книга сравнительно проста и не включает панельные обзоры, но содержит много кода R и примеры, которые должны бытьпрактическое начало.

Чтобы предотвратить повторное изобретение колеса, вы можете проверить LimeSurvey , довольно приличный (не говоря уже о шаблонах :)) инструмент для проводников обследования.Помимо I TYPO3 CMS расширения pbsurvey и ke_questionnaire (должны) также работают хорошо (только проверенный pbsurvey).

0 голосов
/ 22 июля 2010

Спасибо за все ответы.Я согласен с большинством из вас, что этот формат довольно глуп, но я должен работать с ним (опрос задан и будет использоваться на следующей неделе).Это то, что я придумал из всех ответов.Я уверен, что это не самый элегантный или эффективный способ сделать это, но я думаю, что он должен работать.

colnums <- grep("_M",colnames(dat))
responses <- nrow(dat)

for (i in colnums) {
  vec <- as.vector(dat[,i]) #turn into vector
  b <- lapply(strsplit(vec," "),as.numeric) #split up and turn into numeric
  c <- sort(unique(unlist(b))) #which values were used
  newcolnames <- paste(colnames(dat[i]),"_",c,sep="") #column names
  e <- matrix(nrow=responses,ncol=length(c)) #create new matrix for indicators
  colnames(e) <- newcolnames 
#next loop looks for responses and puts indicators in the correct places
  for (i in 1:responses) {
  e[i,] <- ifelse(c %in% b[[i]],1,0)
  }
  dat <- cbind(dat,e)
}

Предложения по улучшению приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...