2016-11-11 4 views
0

Я довольно новичок в искусстве программирования (циклы и т. Д.), И это то, на что я был бы признателен, если бы мог получить мнение, подходит ли мой подход или это определенно необходимо чтобы быть оптимизированным, если он собирался использовать на гораздо большем образце.Групповые ряды данных по последовательным восходящим идентификаторам

В настоящее время у меня есть около 20 000 наблюдений, а один из столбцов - идентификационный номер квитанции. То, что я хотел бы достичь, - назначить каждой строке группе, которая будет состоять из идентификаторов, которые возрастают в формате n + 1. Если это правило нарушено, новая группа должна быть создана до тех пор, пока правило не будет сломано снова.

Для иллюстрации, предположим, что у меня есть эта таблица (Важное замечание, что ID не обязательно являются уникальными и могут повторяться, как ID 10 в моем примере):

MyTable <- data.frame(ID = c(1,2,3,4,6,7,8,10,10,11,17,18,19,200,201,202,2010,2011,2013)) 

MyTable 

    ID 
    1 
    2 
    3 
    4 
    6 
    7 
    8 
    10 
    10 
    11 
    17 
    18 
    19 
    200 
    201 
    202 
    2010 
    2011 
    2013 

В результате моей группировки должны быть следующие :

ID GROUP 
    1  1 
    2  1 
    3  1 
    4  1 
    6  2 
    7  2 
    8  2 
    10  3 
    10  3 
    11  3 
    17  4 
    18  4 
    19  4 
    200 5 
    201 5 
    202 5 
    2010 6 
    2011 6 
    2013 7 

Я использовал dplyr для заказа идентификатора по возрастанию. Затем создала переменную MyData $ Group, которую я просто заполнил 1.

rep(1,length(MyTable$ID) 

for (i in 2:length(MyTable$ID)) { 
    if(MyTable$ID[i] == MyTable$ID[i-1]+1 | MyTable$ID[i] == MyTable$ID[i-1]) { 
    MyTable$ID[i] <- MyTable$GROUP[i-1] 
    } else { 
     MyTable$GROUP[i] <- MyTable$GROUP[i-1]+1 
    } 
} 

Этот код работал для меня, и результаты были получены довольно легко. Тем не менее, мне интересно, если в глазах более опытных программистов этот фрагмент кода будет считаться «плохим», «средним», «хорошим» или любым другим рейтингом, который вы придумали.

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

Спасибо!

+0

, если он работает это хорошо – Nate

+0

используя цикл в R всегда было избежать! но да с точки зрения новичка это хорошо. Теперь попробуйте повысить эффективность, если подумать о взгляде «примените» семьи –

+0

* «на основе нерушимого правила +1» * называется * «последовательные идентификаторы» * или * «последовательные идентификаторы» * * Кроме того, не помещайте это [tag: rstudio], если только он не имеет никакого отношения к RStudio (IDE), который в этом случае не работает. – smci

ответ

3

Чтобы сделать длинную историю короткой:

MyTable$Group <- cumsum(c(1, diff(MyTable$ID) != 1)) 
#  ID Group 
#1  1  1 
#2  2  1 
#3  3  1 
#4  4  1 
#5  6  2 
#6  7  2 
#7  8  2 
#8 10  3 
#9 11  3 
#10 12  3 
#11 17  4 
#12 18  4 
#13 19  4 
#14 200  5 
#15 201  5 
#16 202  5 
#17 2010  6 
#18 2011  6 
#19 2013  7 

Вы ищете все различия в вашем векторе MYTABLE $ ID, которые не являются 1, так это ваши «разрывы». И тогда вы получите cumsum все эти значения. Если вы не знаете cumsum, то введите ?cumsum. Вот и все!

UPDATE: с повторяющимися идентификаторы, вы можете использовать это:

MyTable <- data.frame(ID = c(1,2,3,4,6,7,8,10,10,11,17,18,19,200,201,202,2010,2011,2013)) 
MyTable$Group <- cumsum(c(1, !diff(MyTable$ID) %in% c(0,1))) 

#  ID Group 
#1  1  1 
#2  2  1 
#3  3  1 
#4  4  1 
#5  6  2 
#6  7  2 
#7  8  2 
#8 10  3 
#9 10  3 
#10 11  3 
#11 17  4 
#12 18  4 
#13 19  4 
#14 200  5 
#15 201  5 
#16 202  5 
#17 2010  6 
#18 2011  6 
#19 2013  7 
+1

Я не думаю, что вам нужно привести свою мать в это :) Как насчет того, чтобы вы отредактировали свой вопрос, чтобы включить пример этих повторных идентификаторов. Люди не могут предвидеть эти небольшие проблемы, если вы их не включите. – Nate

+0

Как писал Натан ... как мы должны это знать! Поэтому сделайте ХОРОШИЙ воспроизводимый пример! –

+0

Я обновил свой ответ ... –