将具有相同值的列变量组合成一个新变量

combining column variables with same values into a new variable

正在使用的数据集在此 google 张中 link https://docs.google.com/spreadsheets/d/1eV33Sgx_UVtk2vDtNBc4Yqs_kQoeffY0oj5gSCq9rCs/edit?usp=sharing

AMC.dataset$ExamMC.A<-surveySP15$Exams_A
AMC.dataset$ExamMC.A<-factor(NA, levels=c("TRUE", "FALSE"))
AMC.dataset$ExamMC.A[AMC.dataset$Exams_A=="1 time"|AMC.dataset$Exams_A=="2-4 times"|AMC.dataset$Exams_A==">4 times"]<-"TRUE"
AMC.dataset$ExamMC.A[AMC.dataset$Exams_A=="0 times"]<-"FALSE"
AMC.dataset$ExamMC.A=as.logical(AMC.dataset$ExamMC.A)

我使用这 5 行代码将 Exams_A 到 Exams_I 的所有 9 个变量重新编码为 "True" 的逻辑二元结果,供那些回答了 1 个或更多的人使用这 9 个变量中的任何一个的时间。我想将所有这些变量组合到数据集中的一个新列中,对于每个观察行,如果甚至有一个案例是 "true" 对于 9 exams_A 到 I 中的任何一个整行,新的变量结果将读作 "true",这意味着他们至少犯过一次记录在数据集中的 9 种考试学术不端行为中的任何一种。如果观察行中没有真正的结果,我希望新的变量结果读作 "false",这意味着他们(观察行)从未犯过考试学术不端行为

这个新变量的代码是

 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 个 False 和 0 个 true,将覆盖字符串的其余部分给出 215 "false" 个案例的新变量输出,即使其他变量可能持有 "True" 作为它们的案例输出。

编辑

我现在已经为考试不当行为变量集创建了一个数据框

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)

现在我的问题是如何在正确读取每个观察行的新列中创建复合变量,将数据框中甚至具有单个 "true" 结果的任何行标记为 "true" 为复合变量。任何没有 "true" 结果的观察行都应该被复合变量标记为 "false"。

感谢您的帮助。

我不是 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),如果它在数据中编码为 1 次或多次,则为 (logical)TRUE 并且 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

要创建一个复合行来检查其他数据框列中的任何 TRUE 值,请使用包含在 apply() 中的 any() 函数逐行进行。我想你可以把它应用到你的情况中:

#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