【问题标题】:combining column variables with same values into a new variable将具有相同值的列变量组合成一个新变量
【发布时间】:2015-12-04 21:39:48
【问题描述】:

正在使用的数据集在这个 google sheet 链接中 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 行代码将所有 9 个 Exams_A 到 Exams_I 变量重新编码为逻辑二进制结果“真”,以供那些对这 9 个变量中的任何一个回答 1 次或多次的人使用。我想将所有这些变量组合到数据集中的一个新列中,对于每个观察行,如果整行中的 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 个 False 案例和 0 个 true,将覆盖字符串的其余部分以提供新的变量输出215 个“假”案例,即使其他变量可能将“真”作为案例输出。

编辑

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

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)

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

感谢您的所有帮助。

【问题讨论】:

  • 我想这有点像 ifelse 语句,因此如果该观察行记录的 9 种考试不当行为中的任何一种记录为“真”,那么新的复合变量将显示为“真”数据集,如果是其他情况(如 9 种学术不端行为中的任何一种都没有“真”输出),那么新的复合变量将显示为“假”,因为该观察行没有犯任何类型的考试不端行为。 .
  • 或者作为一个合并函数?
  • 该电子表格未公开共享或不与具有链接访问权限的人共享
  • 修复了链接问题!请让我知道我是否可以提供其他任何东西来更轻松地回答我的问题
  • 这是一个模拟数据集吗?如果这是实际学生并且您在美国,则可能不允许您共享此数据(由于 FERPA)

标签: r merge cbind


【解决方案1】:

要创建一个复合行来检查其他数据框列中的任何 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

【讨论】:

  • 感谢您的回答!我发现这对我很有帮助,所以我很感激你的帮助。这两个答案总体上让我对 ​​R 有了更好的理解
  • 我在为最后一行代码的 function(x) 部分找到正确用途时遇到了麻烦,是否有一个页面可以让我了解 function(x) 的使用情况?
  • 我实际上只是在没有function(x) 部分的情况下运行了代码,它只要您从any 中删除(x) 就可以工作。我更新了代码以显示这一点。您可以查看?apply 以获取更多信息,但我的理解是,如果您将某些内容传递给您使用apply() 调用的函数,或者想要创建自己的函数来接收行作为要处理的数据,您需要添加function(x) ...位。
  • 好的,所以我取出了 any() 的 (x) 部分,我得到的反馈如下: [[1]] function (..., na.rm = FALSE ) .Primitive("any") [[2]] 函数 (..., na.rm = FALSE) .Primitive("any") [[3]] 函数 (..., na.rm = FALSE) 。原始(“任何”)
【解决方案2】:

我不能 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

【讨论】:

  • 感谢您的回答!这真的有助于我理解我哪里出错了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 2022-08-13
相关资源
最近更新 更多