Я обычно могу понять, как векторизовать с небольшим количеством мысли, но, несмотря на чтение через кучу StackOverflow q & a, я все еще в тупике! Я хочу заменить эти вложенные петли на подходящую функцию приложения, но если есть какой-то очевидный другой подход ко всей проблеме, которую я пропустил, не стесняйтесь говорить мне об этом!Векторить эти вложенные петли в R
Подумайте об этом примере в контексте теста, где первая строка является ключом, и каждая последующая строка является ответом студентов. В качестве вывода я хочу массив с 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
Я твердо убежден, что решение этой проблемы является полностью пересмотреть свои структуры данных .... Я буду попытайтесь придумать пример. – joran
Я получил побочные следы, и у вас есть другие ответы ... неважно. – joran