簡體   English   中英

Udin 兩個以上的 apply() 合二為一 function

[英]Udin more than two apply() in one function

我有一些數據,比如學生在考試中的回答。 我寫了一些代碼來計算正確和錯誤的答案,比如

`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)
}`

我想在我的 dataframe 中綁定這些數據並編寫如下代碼

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,])行使用 frame 作為前一行,因此它給數據加上 +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

第一個是預期的,第二個是我得到的。

假設您的數據存儲在dat中,可以使用內置函數來獲得所需的信息。 首先,我假設數據存儲在dat中,並且它是tibbledata.framedata.table 我假設每個學生的名字都在第一列,第一行是正確答案。
為了執行計算,我們可以濫用我們可以將矩陣與另一個M1 == M2進行比較並獲得邏輯矩陣 output。

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

我知道第二個應用在檢查分數評估框架中,第一個應用計算出正確答案的分數。 您可以在 checkscore 中創建一個輔助 df 以在應用中使用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM