[英]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
中,並且它是tibble
、 data.frame
或data.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.