2013-05-23 4 views
0

В 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(), немного сложнее и зависит на другой фрейм данных. Мой вопрос заключается в эффективной вставке в кадр данных в цикле (и мне также интересно, почему это так медленно).

+0

[Инициализировать свои структуры данных, а затем заполнять их, а не расширять их каждый раз.] (Http://stackoverflow.com/a/8474941/636656). Иллюстрация о том, почему это так [плохо] (http://menugget.blogspot.com/2011/11/another-aspect-of-speeding-up-loops-in.html#more). –

+1

Если вы не можете предоставить пример, который действительно соответствует вашей ситуации, никто не сможет вам помочь. – joran

+0

В первом фрагменте я инициализирую фрейм данных. Если вы сделаете str (данные) после первого фрагмента, это «10000 obs. Of 3 variables». – Davor

ответ

1

Ответ векторизации:

data[,2] = 2 
data[,3] = 3 

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

Программирование на новом языке требует нового мышления. Ваш подход дышит скомпилированным языком, нет необходимости в цикле for.

+0

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

+3

Цикл for не медленный, это копирование, вызванное назначением. – joran

+1

@ Если вам нужен точный ответ, пожалуйста, расширьте свой пример выше. Это отвечает на вопрос, который вы задаете выше, хотя это не ваш реальный вопрос. –

Смежные вопросы