Есть ли R-функция, похожая на ifelse, но с несколькими последствиями? - PullRequest
0 голосов
/ 28 сентября 2019

Я сейчас пытаюсь проанализировать некоторые данные опроса.Четыре моих вопроса вызывают у меня головную боль: это закрытые вопросы (a, b, c или d = 1, 2, 3 или 4). Всегда есть один правильный, два «не так уж плохо» и один совершенно неправильный ответ.По сути, все, что я хочу сделать, это дать 1 балл за правильный, 0 за «не совсем, но ...» и -1 за неправильный ответ.

Я уверен, что если я не получу далеко, так какпоследствия бинарные.Я пытался перекодировать, но это приводит к другой проблеме: иногда ответ A является правильным, а B - полностью ложным, иногда C - хорошим, а D - неправильным и т. Д.

Так что я не могу просто использовать что-то вроде этого:

Data <- apply(Data, 2, function(x) {x <- recode(x,"1=0; 2=-1; 3=0; 4=1"); x})

Поскольку я получил только 4 вопроса, я бы перекодировал их один за другим, но я не знаю, как это сделать (всегда получаю сообщение об ошибке при попытке что-то вроде Data§Question1)

Ошибка в применении (данные $ Вопрос1, 2, drop = F, функция (x) {: dim (X) должна иметь положительную длину

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2019

Вопросы к SO должны иметь воспроизводимый код и данные.Поскольку в вопросе не было предоставлено никаких данных, я предоставил образец примечания Data в примечании в конце.Если ваши данные отличаются от данных, внесите соответствующие изменения.

Мы также определяем в примечании фрейм входных данных Codes такой, что Codes[i, j] - это код -1, 0 или 1, который следует использовать для ответаравно i в вопросе j.

Поскольку ответы представлены как 1, 2, 3, 4 в Data, мы можем использовать индексирование в Codes для поиска выходного кода, соответствующего каждому ответу.

cbind( Data[1], mapply(function(x, codes) codes[x], Data[-1], Codes))

с указанием этого фрейма данных:

  Person Q1 Q2
1      A  0  1
2      B  1  0
3      C  0 -1
4      D -1  0
5      E  0  1
6      F  1  0
7      G  0 -1
8      H -1  0

Примечание

Предполагаемые входные данные:

Data <- data.frame(Person = LETTERS[1:8], Q1 = 1:4, Q2 = 4:1, stringsAsFactors = FALSE)

# if, on Q1, the answer is 1 then use 0, if it is 2 use 1, etc.
Codes <- data.frame(Q1 = c(0, 1, 0, -1), Q2 =  c(0, -1, 0, 1))
0 голосов
/ 28 сентября 2019

Проверьте функцию switch (): https://www.datamentor.io/r-programming/switch-function/#targetText=The%20switch()%20function%20in,the%20corresponding%20value%20is%20returned.

Вы можете сделать что-то вроде этого:

PointsSum = PointsSum - switch(AnswerID,CorrectAnswerID = 1, NeutralAnswerID = 0, BadAnswerID = -1)
0 голосов
/ 28 сентября 2019

Думайте о своих вычислениях как о двух шагах.Сначала вы находите оценку по конкретному вопросу, затем применяете эту оценку к своим данным.

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

# Record the scoring for each question
scoring <- list(Question1 = c(1, 0, -1, 0),
                Question2 = c(-1, 0, 1, 0),
                Question3 = ...)

# Loop through the questions:
for (question in paste0(Question, 1:4)) {
  score <- scoring[[question]]
  answers <- Data[[question]]
  scores <- score[answers]
  # record those scores somewhere
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...