В R, я создаю фрейм данных в следующий образе:Присвоения фрейма данных большого R
data <- data.frame(dummy=rep('dummy',10000))
data$number = 0
data$another = 1
Когда я запустить цикл, который присваивает значение кадра данных (перебор строк), мой код работает бесконечно медленный
calculation <- function() {2}
somethingElse <- function() {3}
system.time(
for (i in 1:10000) {
data[i,2]=calculation()
data[i,3]=somethingElse()
}
)
Этот сниппет работает через 20 секунд на моем ноутбуке. На других языках, таких как C или Java, это заканчивается мгновенно. Почему это так медленно в R? Я помню, что читал, что R хранит матрицы по столбцу (в отличие от C, например, где он по строке). Но все же я озадачен тем, почему так много времени. Должен ли мой файл data.frame удобно размещаться в памяти (ускользая от медленного поведения записи на диск)?
В качестве продолжения моего вопроса я хотел бы попросить быстрый способ заполнить мои данные по строкам, если таковой существует.
EDIT: Обратите внимание, что я не пытаюсь назначить константы 2 и 3 для моего фрейма данных, в фактической проблеме, которую я пытался решить для вычисления() и somethingElse(), немного сложнее и зависит на другой фрейм данных. Мой вопрос заключается в эффективной вставке в кадр данных в цикле (и мне также интересно, почему это так медленно).
[Инициализировать свои структуры данных, а затем заполнять их, а не расширять их каждый раз.] (Http://stackoverflow.com/a/8474941/636656). Иллюстрация о том, почему это так [плохо] (http://menugget.blogspot.com/2011/11/another-aspect-of-speeding-up-loops-in.html#more). –
Если вы не можете предоставить пример, который действительно соответствует вашей ситуации, никто не сможет вам помочь. – joran
В первом фрагменте я инициализирую фрейм данных. Если вы сделаете str (данные) после первого фрагмента, это «10000 obs. Of 3 variables». – Davor