объединение переменных столбца с одинаковыми значениями в новую переменную

используемый набор данных находится в этой ссылке на листы Google

Я использую эти 5 строк кода, чтобы перекодировать все 9 переменных Exams_A - Exams_I в логические двоичные результаты «Истина» для тех, кто ответил 1 или более раз для любой из этих 9 переменных. Я хотел бы объединить все эти переменные в новый столбец в наборе данных, в котором для каждой строки наблюдения, если есть хотя бы один случай, который является «истинным» для любого из 9 экзаменов от A до I во всей этой строке, новая переменная результат будет считаться «истинным», что означает, что они хотя бы однажды совершили любой из 9 типов нарушений академической дисциплины, записанных в наборе данных. если в строке наблюдения нет истинных результатов, я бы хотел, чтобы результат новой переменной читался как «ложный», что означает, что они (строка наблюдения) никогда не совершали академических нарушений на экзамене

то, что у меня есть для кода этой новой переменной,

 AMC.dataset$ExamMC = any(AMC.dataset$ExamMC.A, AMC.dataset$ExamMC.B, AMC.dataset$ExamMC.C, AMC.dataset$ExamMC.D, AMC.dataset$ExamMC.E, AMC.dataset$ExamMC.F, AMC.dataset$ExamMC.G, AMC.dataset$ExamMC.H, AMC.dataset$ExamMC.I)

однако этот код был переопределен последней выходной переменной в строке (AMC.dataset $ ExamMC.I), которая имеет 215 ложных случаев и 0 истинных значений, переопределит остальную часть строки, чтобы дать новые выходные переменные 215 "ложных. "case, даже если другие переменные могут содержать" True "в качестве вывода case.

РЕДАКТИРОВАТЬ

Я создал фрейм данных для набора переменных ненадлежащего поведения на экзамене.

AMC.dataset$ExamMCdf<-data.frame(AMC.dataset$ExamMC.A, AMC.dataset$ExamMC.B, AMC.dataset$ExamMC.C, AMC.dataset$ExamMC.D, AMC.dataset$ExamMC.E, AMC.dataset$ExamMC.F, AMC.dataset$ExamMC.G, AMC.dataset$ExamMC.H, AMC.dataset$ExamMC.I)

Теперь мой вопрос заключается в том, как создать составную переменную в новом столбце, которая правильно считывает каждую строку наблюдения, помечая любую строку, которая имеет хотя бы один «истинный» результат во фрейме данных, как «истину» для составной переменной. Любая строка наблюдения без «истинных» результатов должна быть помечена составной переменной как «ложная».

Спасибо за всю твою помощь.


person Christopher Hahn    schedule 04.12.2015    source источник
comment
Я предполагаю, что это было бы похоже на оператор ifelse, так что новая составная переменная будет считаться истиной, если эта строка наблюдения записала истину для любого из 9 типов нарушений правил экзамена, записанных в наборе данных, если еще (например, если нет истинные выходы для любого из 9 типов нарушений в учебе), тогда новая составная переменная будет считаться ложной, поскольку в этой строке наблюдения не было совершено никаких нарушений на экзамене.   -  person Christopher Hahn    schedule 05.12.2015
comment
или, возможно, как функция слияния?   -  person Christopher Hahn    schedule 05.12.2015
comment
эта таблица не является общедоступной или для тех, у кого есть доступ по ссылкам   -  person MichaelChirico    schedule 05.12.2015
comment
исправили проблему со ссылкой! пожалуйста, дайте мне знать, есть ли что-нибудь еще, что я могу предоставить, чтобы облегчить ответ на мой вопрос   -  person Christopher Hahn    schedule 05.12.2015
comment
это смоделированный набор данных? вам, вероятно, не разрешено делиться этими данными, если это реальные студенты, и вы находитесь в США (из-за FERPA)   -  person MichaelChirico    schedule 05.12.2015
comment
да, этот набор данных смоделирован   -  person Christopher Hahn    schedule 05.12.2015


Ответы (2)


Чтобы создать составную строку, которая проверяет любые ИСТИННЫЕ значения в других столбцах фрейма данных, используйте функцию any(), заключенную в apply(), чтобы перемещаться строка за строкой. Я думаю, вы можете применить это к своей ситуации:

#Makes a dataframe with TRUE/FALSE values and a low chance for TRUE
set.seed(123)
data <- data.frame(
  Exams_A = sample(c(TRUE,FALSE), 10, TRUE, c(.1, .9)),
  Exams_B = sample(c(TRUE,FALSE), 10, TRUE, c(.1, .9)),
  Exams_C = sample(c(TRUE,FALSE), 10, TRUE, c(.1, .9)),
  Exams_D = sample(c(TRUE,FALSE), 10, TRUE, c(.1, .9)),
  Exams_E = rep(TRUE,10) # Inserts row of all TRUE's to show that you can limit scope
)

data$ExamMC <- apply(data[, 1:4], 1, function(x) any(x))
data$ExamMC <- apply(data[, 1:4], 1, any) # This is the updated version
                          # ^ This part sets what columns you want to search
person Andrew Jackson    schedule 05.12.2015
comment
Спасибо за ваш ответ! Я обнаружил, что это очень полезно для меня, поэтому ценю вашу помощь. оба ответа дали мне лучшее понимание R в целом - person Christopher Hahn; 06.12.2015
comment
У меня проблемы с поиском правильного использования части функции (x) в этой последней строке кода, есть ли страница, где я могу прочитать об использовании функции (x)? - person Christopher Hahn; 07.12.2015
comment
На самом деле я просто запустил код без части function(x), и он работает до тех пор, пока вы удалите (x) из any. Я обновил код, чтобы показать это. Вы можете посмотреть ?apply для получения дополнительной информации, но я понимаю, что если вы передаете что-то функции, которую вызываете с помощью apply(), или хотите создать свою собственную функцию, которая принимает строку как данные для обработки, вам нужно добавить бит function(x) .... - person Andrew Jackson; 07.12.2015
comment
хорошо, поэтому я вынул часть (x) для any () и получаю обратную связь, которая выглядит примерно так: [[1]] function (..., na.rm = FALSE) .Primitive (any) [[ 2]] функция (..., na.rm = FALSE) .Primitive (any) [[3]] function (..., na.rm = FALSE) .Primitive (любой) - person Christopher Hahn; 07.12.2015

Я не уверен на 100%, что вам нужно, но вот как я бы сделал то, что, как я думаю, вы задумали:

library(data.table)
setDT(surveySP15)

exams <- paste0("Exams_", LETTERS[1:9])
surveySP15[ , paste0(exams, "_binary") :=
             lapply(.SD, function(x) x %in% c("1 time", "2-4 times", ">4 times")),
           .SDcols = exams]

Это создаст переменную для каждого экзамена (например, Exams_A_binary), которая будет (logical) TRUE, если она закодирована в данных как 1 или более раз, и FALSE в противном случае. Вот соответствующий результат:

> surveySP15[ , paste0(exams, "_binary"), with = FALSE]
     Exams_A_binary Exams_B_binary Exams_C_binary Exams_D_binary Exams_E_binary Exams_F_binary Exams_G_binary
  1:          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE
  2:          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE
  3:          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE
  4:          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE
  5:          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE
 ---                                                                                                         
223:          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE
224:           TRUE           TRUE           TRUE          FALSE           TRUE          FALSE          FALSE
225:          FALSE           TRUE          FALSE          FALSE          FALSE          FALSE          FALSE
226:          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE
227:          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE          FALSE
     Exams_H_binary Exams_I_binary
  1:          FALSE          FALSE
  2:          FALSE          FALSE
  3:          FALSE          FALSE
  4:          FALSE          FALSE
  5:          FALSE          FALSE
 ---                              
223:          FALSE          FALSE
224:          FALSE          FALSE
225:          FALSE          FALSE
226:          FALSE          FALSE
227:          FALSE          FALSE
person MichaelChirico    schedule 04.12.2015
comment
Спасибо за ваш ответ! это действительно помогает мне понять, где я ошибся. Я ценю помощь! - person Christopher Hahn; 06.12.2015