首页 > 解决方案 > 一个函数中有两个以上的apply()

问题描述

我有学生在考试中回答的数据。我写了一些代码来计算正确和错误的答案,比如

`ncorrect <- function(resp,keyt){
  cr <- sum(resp == keyt, na.rm = T)
  return(cr)
}


nfalse <- function(resp,keyt){
  fl <- sum(resp != keyt, na.rm = T)
  return(fl)
}`

我想将这些数据绑定到我的数据框中并编写了类似的代码

checkscores <- function(frame){
 frame$ncorrect <- apply(frame,1,ncorrect,keyt=frame[1,]) 
 frame$nfalse <- apply(frame,1,nfalse,keyt=frame[1,])
  return(frame)
}

但是该行frame$nfalse <- apply(frame,1,nfalse,keyt=frame[1,]) 使用框架作为上一行,因此它为数据提供了加法+1。我怎样才能解决这个问题 ?感谢您的关注

编辑:

       V2   V3   V4 V5   V6 ncorrect nfalse
key      A    B    C  D    A        5      0
ahmet    A <NA> <NA>  D    A        3      0
canan    A    D <NA>  D    A        3      1
kemal    D    C    B  A    A        1      4
meral    A    B    C  D    D        4      1
ziya     C    C    C  D    A        3      2
mine  <NA>    A    C  D <NA>        2      1






       V2   V3   V4 V5   V6 ncorrect nfalse
key      A    B    C  D    A        5      0
ahmet    A <NA> <NA>  D    A        3      1
canan    A    D <NA>  D    A        3      2
kemal    D    C    B  A    A        1      5
meral    A    B    C  D    D        4      2
ziya     C    C    C  D    A        3      3
mine  <NA>    A    C  D <NA>        2      2

第一个是预期的,第二个是我得到的。

标签: r

解决方案


假设您的数据存储在 中dat,可以使用内置函数来实现所需的信息。首先,我假设数据存储在 中,dat并且它是 a或. 我假设每个学生的名字都在第 1 列,正确答案在第一行。 为了执行计算,我们可以滥用我们可以将一个矩阵与另一个矩阵进行比较并获得一个逻辑矩阵作为输出。tibbledata.framedata.table
M1 == M2

correct_test_answers <- dat[1, 2:6]
test_answers <- dat[-1, 2:6]
correct_answers <- rowSums(as.matrix(test_answers) == matrix(correct_test_answers, 
                                                             ncol = 5, 
                                                             nrow = nrow(test_answers)),
                           na.rm = TRUE)
not_answers <- rowSums(is.na(test_answers), na.rm = TRUE)
wrong_answers <- 5 - correct_answers - not_answers
dat[-1, c('correct', 'wrong', 'not_answers')] <- data.frame(correct_answers, 
                                                            wrong_answers, 
                                                            not_answers)
dat
      V1   V2   V3   V4 V5   V6 correct wrong not_answers
1:   key    A    B    C  D    A      NA    NA          NA
2: ahmet    A <NA> <NA>  D    A       3     0           2
3: canan    A    D <NA>  D    A       1     3           1
4: kemal    D    C    B  A    A       1     4           0
5: meral    A    B    C  D    D       0     5           0
6:  ziya    C    C    C  D    A       0     5           0
7:  mine <NA>    A    C  D <NA>       2     1           2

推荐阅读