代码之家  ›  专栏  ›  技术社区  ›  Zach Eisner

格式化考试结果以在R中进行t检验

  •  1
  • Zach Eisner  · 技术社区  · 6 年前

    问题概述: 我有一个包含15个问题的教学前和教学后考试结果的数据集。我希望对结果进行t检验,以比较整体平均值,但很难正确格式化数据集。 数据集的示例部分如下所示:

                 1Pre  1Post   2Pre  2Post    3Pre  3Post    4Pre  4Post
    Correct          B    B        A    A         B    B         C    C
    1                B    B        C    D         C    B         C    C
    2                C    B        B    D         C    B         C    A
    3             <NA> <NA>     <NA> <NA>        <NA> <NA>       <NA> <NA>
    4                B    B        B    A         B    B         C    C
    5                B    B        B    A         B    B         C    C
    6                C    B        D    A         A    D         C    B
    7                C    C        D    D         E    E         C    C
    8                C    A        B    B         A    A         <NA> <NA>
    

    目标: 我想将“正确”的值与下面几行中的值相匹配,这样一来,1是正确的,0是不正确的。我使用以下代码实现了这一点:

    for(j in 1:ncol(qDat)){
      for(i in 1:nrow(qDat)){
        if(qDat[i,j] == correctAns[1]){
          qDat[i,j]=1
        }else{
          qDat[i,j]=0
        }
      }
    }
    

    然后,除了比较每个问题的前后分数之间的差异外,我还想进行一个t检验,比较前后平均值,但是,我需要省略任何带有NA的数据点。目前,我的方法不适用于任何NA值,因此将其替换为零。是否有任何方法可以运行这些测试并简单地忽略NA值?非常感谢。

    所需的输出:

                 1Pre  1Post   2Pre  2Post    3Pre  3Post    
    Correct          B    B        A    A         B    B         
    1                1    1        0    0         0    1        
    2                0    1        0    0         0    1        
    3             <NA> <NA>     <NA> <NA>        <NA> <NA>       
    4                1    1        0    0         1    1        
    5                1    1        0    0         1    1        
    6                0    1        0    1         0    0        
    7                0    0        0    0         0    0         
    8                0    0        0    0         0    0        
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Fons MA    6 年前

    您可以尝试将以下参数传递给t.test调用:

    na.action = na.omit

    比如:

    with(qDat, t.test(`1Pre`, `1Post`, na.action = na.omit))
    
        2
  •  1
  •   niko    6 年前

    那么这个呢:

    重写你的循环-不需要太担心 NA 就像你对待他们一样 0 ,我们可以简单地测试结果,然后设置 是的 FALSE :

    test <- qDat == correctAns # or correctAns[1] depending on your needs
    test[is.na(test)] <- FALSE
    storage.mode(test) <- "integer"
    test
    #      X1 X2 X3 X4 X5 X6 X7 X8
    # [1,]  0  1  0  0  1  0  1  0
    # [2,]  0  0  1  0  0  0  0  0
    # [3,]  0  1  0  0  1  0  0  0
    # [4,]  0  0  1  0  0  0  0  0
    # [5,]  1  0  0  0  0  0  1  0
    # [6,]  0  0  1  1  1  1  1  0
    # [7,]  0  0  0  1  0  0  1  0
    # [8,]  0  0  0  0  0  0  0  1
    

    用数据

    set.seed(123)
    correctAns <- sample(LETTERS[1:3], 8, replace = TRUE) 
    correctAns
    # [1] "A" "C" "B" "C" "C" "A" "B" "C"
    qDat <- sample(c(LETTERS[1:3], NA_character_), 8*2*4, replace = TRUE)
    qDat <- data.frame(matrix(qDat, 8, 4*2), stringsAsFactors = FALSE)
    qDat
      #     X1   X2   X3   X4 X5   X6   X7   X8
      # 1    C    A    C    C  A    B    A <NA>
      # 2    B    A    C <NA>  B <NA> <NA>    B
      # 3 <NA>    B    C    A  B    A <NA> <NA>
      # 4    B <NA>    C    B  B    B    B <NA>
      # 5    C <NA>    B <NA>  A <NA>    C <NA>
      # 6    C    C    A    A  A    A    A    B
      # 7    A    C <NA>    B  A    C    B <NA>
      # 8 <NA> <NA> <NA>    A  B    A    B    C
    

    编辑

    set.seed(123)
    #  correctAns is a vector of length 30
    correctAns <- sample(LETTERS[1:3], 30, replace = TRUE) 
    length(correctAns)
    # [1] 30
    # qDat is a dataframe of dimensions 106x30 
    qDat <- sample(c(LETTERS[1:3], NA_character_), 106*30, replace = TRUE)
    qDat <- data.frame(matrix(qDat, 106, 30), stringsAsFactors = FALSE)
    dim(qDat)
    # [1] 106  30
    
    # still works
    test <- qDat == correctAns
    test[is.na(test)] <- FALSE
    storage.mode(test) <- "integer"
    str(test)
    # int [1:106, 1:30] 0 0 0 0 0 0 0 0 1 0 ...
    # - attr(*, "dimnames")=List of 2
    # ..$ : NULL
    # ..$ : chr [1:30] "X1" "X2" "X3" "X4" ...