【问题标题】:Is there a R function similar to ifelse but with multiple consequences?是否有类似于 ifelse 但具有多种后果的 R 函数?
【发布时间】:2019-09-28 12:05:02
【问题描述】:

我目前正在尝试分析一些调查数据。 我的四个问题让我很头疼: 它们是封闭式问题(a、b、c 或 d =1、2、3 或 4) 总是有一个正确的答案,两个“还不错”的答案和一个完全错误的答案。 基本上我想做的就是给正确的1分,0为“不是真的但是......”和-1为错误的答案。

很确定 ifelse 不会让我走得太远,因为后果是二元的。 我试图重新编码,但这会导致另一个问题: 有时答案 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 这样的东西时总是会出错)

应用错误(Data$Question1, 2, drop = F, function(x) { : dim(X) 的长度必须为正

【问题讨论】:

  • 你试过嵌套ifelse吗?你能添加一些示例数据吗?
  • 看看dplyr::case_when,或switch
  • 这两个选项可以正常工作,但我最大的问题是,它正确的值和每个问题不会改变的值。假设问题 1 的正确答案值为 1,错误值为 3,但问题 2 反之亦然……此外,这可以提供一些示例数据: Questions
  • 您需要先融合/收集/pivot_wider 数据以获得更好的控制,然后再映射 case_when/nested_ifelse 或其他任何功能。
  • @EarlGrey。您不应该使用 cmets 来澄清您的问题。而是使用edit

标签: r


【解决方案1】:

认为您的计算涉及两个步骤。首先,您找到特定问题的得分,然后将该得分应用于您的数据。

我们没有可重现的示例向我们展示您的数据的原始形式,但这是解决您的问题的一般方法。

# 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
}

【讨论】:

    【解决方案2】:

    向 SO 提出的问题应具有可重现的代码和数据。由于问题中没有提供数据,我在最后的注释中提供了一个示例数据框Data。如果您的数据与此不同,请进行适当的修改。

    我们还在注释中定义了一个输入数据框Codes,这样Codes[i, j] 是代码 -1、0 或 1,用于在问题 j 上等于 i 的答案。

    由于答案在Data 中表示为 1、2、3、4,我们可以使用对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))
    

    【讨论】:

      【解决方案3】:

      检查 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-21
        • 2012-04-08
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多