2015-03-27 4 views
3

Как указано в заголовке, я пытаюсь создать столбец в data.table, который будет действовать как уникальный идентификатор другого столбца. Мой набор данных в нескольких сотнях миллионов наблюдений, но вот установить игру и код, который я работал до сих пор:Создайте столбец уникальных идентификаторов на основе другого столбца в data.table

# I use a key because there are many more columns, but they are irrelevant here 
myDT <- data.table(Addy=c("12hig", "12hig", "12hig", "1AbHN", "198aM"),key="Addy") 

    Addy 
1: 12hig 
2: 12hig 
3: 12hig 
4: 198aM 
5: 1AbHN 

uniqueDT <- unique(myDT[,list(Addy)]) # is this inefficient? 
uniqueDT[,mrpId := seq(1,nrow(uniqueDT),1)] 

Addy mrpId 
1: 12hig  1 
2: 198aM  2 
3: 1AbHN  3 


myDT[J(uniqueDT)] 
    Addy mrpId 
1: 12hig  1 
2: 12hig  1 
3: 12hig  1 
4: 198aM  2 
5: 1AbHN  3 

Моего код выше выполняет свою работу, но я не знаю, если он эффективен , Есть ли еще data.table -образный способ сделать это?

Edit:

Вы можете быть удивлены, почему я создаю уникальные идентификаторы из уникальных идентификаторов. Ну, идея здесь состоит в том, чтобы создать хэш. Данные столбца «Addy» - очень длинные строки, и мне нужно делать операции над этими данными, поэтому я думаю, что лучше работать с меньшим количеством байтов.

+0

Как ваш больше вопрос, если вы установите 'Addy' в качестве своего ключа (что, вероятно, вам стоит), я немного скептически отношусь к тому, что вы получите много, если вы ускорите его, используя альтернативный столбец, содержащий ту же самую информацию группировки. Мое сильное предположение (но это всего лишь догадка) заключается в том, что за кулисами - содержат ли они очень короткие или очень длинные строки - любые две столбцы с ключом используют один и тот же механизм для id, подмножество и работают с подгруппами данных. Таблица. –

+0

Интересно, я буду помнить об этом. На данный момент, однако, после нескольких операций в R данные экспортируются в другие программы, которые не так эффективны для памяти, как 'data.table'. – mrp

+0

@frank Yea, окончательное редактирование Matt Dowle охватывает это. Однако я искал этот вопрос и не нашел этот вопрос, или этот: http://stackoverflow.com/questions/28910376/is-there-a-way-in-data-table-to-assign-ids- by-group-based-on-identifier? lq = 1 – mrp

ответ

4

Это должно быть быстро, и, по крайней мере, немного более простой:

myDT[, mrpID:=.GRP, by=Addy] 
myDT 
    Addy mrpID 
1: 12hig  1 
2: 12hig  1 
3: 12hig  1 
4: 198aM  2 
5: 1AbHN  3 
+0

Это прекрасно! – mrp

0

Помимо data.table, то basefactor класс, кажется, что вам нужно:

myDT[, mrpID:=as.numeric(as.factor(Addy))] 
+0

Я пробовал идти по этому маршруту, но работа 'as.numeric (as.factor())' оказалась довольно медленной. – mrp

+0

Кроме того, при выполнении чего-то подобного вам необходимо принять специальные меры, чтобы вернуть возвращаемые значения в порядке возрастания. (Попробуйте это, чтобы понять, что я имею в виду: 'as.numeric (as.factor (c (" C "," B "," A ")))'.) Вы можете обойти эту конкретную проблему с помощью 'x <- c («C», «B», «A»); as.numeric (factor (x, levels = unique (x))) ' –

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