【问题标题】:Formatting exam results to perform a t-test in R格式化考试结果以在 R 中执行 t 检验
【发布时间】:2019-01-21 07:06:12
【问题描述】:

问题概述:我有一个数据集,其中包含 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        

【问题讨论】:

    标签: r dataframe format t-test


    【解决方案1】:

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

    na.action = na.omit

    类似:

    with(qDat, t.test(`1Pre`, `1Post`, na.action = na.omit))
    

    【讨论】:

    • 谢谢!这解决了问题的后半部分。现在的问题是将 A、B、C、D 字符转换为 0 和 1,如果它们匹配正确的答案值而不丢失 NA 值。你有什么建议吗?干杯!
    • @ZachEisner,您只需要删除 nate 建议中的 test[is.na(test)] &lt;- FALSE 即可完成您想要的操作
    【解决方案2】:

    这个呢:

    重写了您的循环 - 无需过多担心 NAs,因为您将它们视为 0,我们可以简单地测试结果,然后将 NAs 设置为 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" ...
    

    【讨论】:

    • 谢谢!实现你的第一行代码我得到错误‘==’ only defined for equally-sized data frames。作为参考,correctAns 是一个长度为 30(30 个问题)的向量,qDat 是一个 106x30 维度的数据框(106 个参与者,30 个问题)
    • @ZachEisner 我用您指定的尺寸复制了它,它仍然有效 - 请参阅编辑。你确定qDat 不是30 by 106 吗? t(qDat)==correctAns 有效吗?
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2017-09-16
    • 2021-06-16
    相关资源
    最近更新 更多