将具有相同值的列变量组合成一个新变量
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
正在使用的数据集在此 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