R Самый быстрый способ записи для цикла с использованием векторизации

#r #performance #for-loop #vectorization #apply

#r #Производительность #для цикла #векторизация #применить

Вопрос:

Допустим, у меня есть простой цикл for, который добавляет случайное значение к фрейму данных.

 person <- c("Clark Kent", "Bruce Wayne", "Tony Stark", "Carol Danvers")
sleep_time <- c(8, 1, 3, 6)
data <- data.frame(person, sleep_time)

for (i in 1:length(data$person)) {
  idle <- sample(20:32, 1)
  data$idle_time[i] <- idle
}
 

Как бы я написал это, используя возможности векторизации R, чтобы ускорить процесс до максимально возможного? Я знаю, что циклы for не рекомендуются, но также прочитал, что функции apply работают не намного быстрее.

Мои извинения, если эти вопросы похожи на другие. Я новичок в использовании возможностей векторизации R, и у меня возникают некоторые проблемы с пониманием того, как конвертировать между циклами и гораздо более быстрой векторизованной формой.

Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.

Спасибо.

Комментарии:

1. Это то, что вы хотите? — data$idle_time <- sample(20:32, nrow(data), replace = T)

Ответ №1:

Не уверен, каков на самом деле ваш вариант использования, однако для этого конкретного случая вы можете полностью отказаться от for цикла, выполнив

 data$idle_time <- sample(20:32, nrow(data))
 

Возможно, вы захотите включить условие replace = TRUE , если ваше количество строк больше length(20:32) .