Как сделать этот цикл более эффективным? - PullRequest
4 голосов
/ 24 ноября 2011

У меня есть фрейм данных, который выглядит следующим образом:

user1,product1,0
user1,product2,2
user1,product3,1
user1,product4,2
user2,product3,0
user2,product2,2
user3,product4,0
user3,product5,3

Фрейм данных содержит миллионы строк. Мне нужно пройти через каждую строку, и если значение в последнем столбце равно 0, сохранить этот номер продукта, в противном случае прикрепить номер продукта к предыдущему номеру продукта со значением = 0, а затем записать в новый фрейм данных.

Например, результирующая матрица должна быть

user1,product1
user1,product1product2
user1,product1product3
user1,product1product4
user2,product3
user2,product3product2
user3,product4
user3,product4product5

Я написал цикл for для прохождения каждой строки, и он работает, но очень-очень медленно. Как я могу ускорить это? Я пытался векторизовать его, но я не уверен, как, потому что мне нужно проверить значение предыдущей строки.

1 Ответ

9 голосов
/ 24 ноября 2011

Обратите внимание, что у вас нет матрицы .Матрица может содержать только один атомарный тип (число, целое число, символ и т. Д.).У вас действительно есть data.frame.

То, что вы хотите сделать, легко сделать с помощью na.locf из пакета zoo и функции ifelse.используя data.frame, вы должны убедиться, что столбцы «product» являются символьными, а не множителями (код выше даст странные результаты, если столбцы «product» являются факторами).

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