У меня есть вектор значений, который я хочу использовать для изменения согласованного компонента вложенного списка. В настоящее время я использую для этого цикл for, который оказывается довольно медленным, и мне интересно, есть ли более быстрый способ сделать это.
В качестве воспроизводимого примера:
#Create Data and List
set.seed(100)
Students <- c("Amy", "Ben", "Caz")
Subject <- c("Maths", "English", "Science")
ExamResults <- lapply(Students, function (r) {
Scores <- lapply(Subject, function(x) round(runif(4, 0, 100)))
names(Scores) <- Subject
Scores
})
names(ExamResults) <- Students
Что создает список, который выглядит следующим образом:
$Amy
$Amy$Maths
[1] 31 26 55 6
$Amy$English
[1] 47 48 81 37
$Amy$Science
[1] 55 17 62 88
$Ben
$Ben$Maths
[1] 28 40 76 67
$Ben$English
[1] 20 36 36 69
$Ben$Science
[1] 54 71 54 75
$Caz
$Caz$Maths
[1] 42 17 77 88
$Caz$English
[1] 55 28 49 93
$Caz$Science
[1] 35 95 70 89
Теперь предположим, что вторая работа по математике для всех учащихся отмечена:
#New Data
MathsRemark <- c(24, 50, 45) #assume in correct (alphabetical) order
И мы хотим изменить их существующую вторую оценку по математике для этих новых значений. Мое текущее решение для этого:
#Current Slow Solution
for (i in 1:length(Students)) {
ExamResults[[i]][["Maths"]][[2]] <- MathsRemark[i]
}
На больших наборах данных это оказывается очень медленным. Кто-нибудь знает более быстрый способ сделать это? Меня учили избегать использования циклов for там, где возможна векторизация, но я не могу понять, как векторизовать эту проблему. Любые идеи будут высоко оценены.