【发布时间】:2023-03-21 08:24:01
【问题描述】:
我通常只要稍加思考就能弄清楚如何进行矢量化,但是尽管阅读了一堆 StackOverflow 问答,我仍然感到困惑! 我想用合适的 apply 函数替换这些嵌套的 for 循环,但如果有一些明显不同的方法可以解决我错过的整个问题,请随时告诉我!
在测试的上下文中考虑这个示例,其中第一行是关键,随后的每一行都是学生的答案。作为输出,我想要一个数组,每个正确答案为 1,每个错误答案为 0。 for 循环可以工作,但是当您扩展到数千行和列时会非常慢。
这是我的可重现示例,提前感谢您的帮助!
#build sample data
dat <- array(dim=c(9,6))
for (n in 1:9){
dat[n,1:6] <- c(paste("ID00",n,sep=""),
sample(c("A","B","C","D"), size=5, replace=TRUE))}
dat[3,4]<-NA
key<-c("key","A","B","B","C","D")
dat <- rbind(key,dat)
>dat
[,1] [,2] [,3] [,4] [,5] [,6]
"key" "A" "B" "B" "C" "D"
"ID001" "B" "A" "D" "B" "C"
"ID002" "C" "C" "C" "B" "B"
"ID003" "A" "C" NA "D" "D"
"ID004" "D" "B" "D" "A" "A"
"ID005" "A" "C" "A" "C" "A"
"ID006" "D" "D" "B" "B" "A"
"ID007" "B" "D" "A" "D" "A"
"ID008" "D" "D" "B" "D" "A"
"ID009" "D" "C" "B" "D" "D"
#score file
dat2 <- array(dim=c(9,5))
for (row in 2:10){
for (column in 2:6){
if (is.na(dat[row,column])){
p <- NA
}else if (dat[row,column]==dat[1,column]){
p <- 1
}else p <- 0
dat2[row-1,column-1]<-p
}
}
> dat2
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 0 0 0
[3,] 1 0 NA 0 1
[4,] 0 1 0 0 0
[5,] 1 0 0 1 0
[6,] 0 0 1 0 0
[7,] 0 0 0 0 0
[8,] 0 0 1 0 0
[9,] 0 0 1 0 1
【问题讨论】:
-
我坚信解决这个问题的方法是彻底重新思考你的数据结构......我会试着编造一个例子。
-
我跑题了,你得到了其他答案……没关系。