Может кто-нибудь объяснить основные методы R? - PullRequest
0 голосов
/ 11 января 2019

Я пришел из Python и C ++, и R, кажется, использует магию, которую я не понимаю. Я надеялся, что кто-нибудь сможет дать мне некоторое представление о том, как это работает.

Мне было поручено применить алгоритм к каждой строке в таблице из 3400000 точек данных, и, исходя из C ++, я подумал перебрать таблицу, вычислить ее вручную и ввести в таблицу как таковой:

add_elev <- function(all, elev){
  row <- 1
  while(row < nrow(all)){
    adder <- filter(elev, lake_id == all[row, "lake_id"][[1]])
    curr_id <- all[row, "lake_id"][[1]]
    while(all[row, "lake_id"][[1]] == curr_id){

      all[row, "elevation"] <- adder[1, "elevation"][[1]]
      row <- row + 1

      if (row > nrow(all)){
        break
      }
      if (all[row, "lake_id"][[1]] != curr_id){
        break
      }

    }

    if (row > nrow(all)){
      break
    }

  }
  return(all)
}

Функция работает, но, по оценкам, она занимает около 9 часов. Посмотрев в некоторых справочниках, я обнаружил, что могу сделать то же самое, просто используя "all <- left_join (all, elevation, by =" lake_id ")". Это закончилось менее чем за секунду, и, по-видимому, все 3 400 000 точек данных были правильными. Единственный способ, которым я мог думать об этом, был через итерацию, поэтому я понятия не имею, как эта маленькая строка кода закончилась так быстро. Может ли кто-нибудь объяснить мне магию этих плиток? </p>

1 Ответ

0 голосов
/ 11 января 2019
Магия

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

Векторизация иногда использует рециркуляцию для обеспечения того, чтобы структуры данных имели одинаковый размер для более быстрого выполнения операции. Назначения элементов (как в вашем примере), как правило, требуют копий переменных, что замедляет обработку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...