Заполнение столбца индекса в data.table

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

ddt = structure(list(Unit = structure(c(1L, 1L, 2L, 2L, 3L, 3L), .Label = c("A", 
"A1", "B"), class = "factor"), Anything = c(3.4, 6.9, 1.1, 2.2, 
2, 3), index = c(0, 0, 0, 0, 0, 0)), .Names = c("Unit", "Anything", 
"index"), row.names = c(NA, -6L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x8948f68>, sorted = c("Unit", 
"Anything"))

ddt
   Unit Anything index
1:    A      3.4     0
2:    A      6.9     0
3:   A1      1.1     0
4:   A1      2.2     0
5:    B      2.0     0
6:    B      3.0     0

Столбец индекса должен быть заполнен на 1,2,3... для каждой единицы. Для data.frame я могу сделать это:

for(U in unique(ddt$Unit)){
    ddt[ddt$Unit==U,]$index = 1:length(ddt[ddt$Unit==U,]$Unit)
}

ddt
  Unit Anything index
1    A      3.4     1
3    A      6.9     2
4   A1      1.1     1
2   A1      2.2     2
5    B      2.0     1
6    B      3.0     2

Но как это сделать с помощью команд data.table? Спасибо за вашу помощь.


person rnso    schedule 27.08.2014    source источник


Ответы (3)


Пытаться

 ddt[, indx:=1:.N, by=Unit]
 #     Unit Anything indx
 #1:    A      3.4    1
 #2:    A      6.9    2
 #3:   A1      1.1    1
 #4:   A1      2.2    2
 #5:    B      2.0    1
 #6:    B      3.0    2
person akrun    schedule 27.08.2014

Одна проблема заключается в том, что вы не можете изменить класс столбца, используя := (поскольку индекс имеет тип double и в идеале вам нужны целые числа). Я бы рекомендовал удалить index и воссоздать его с :=:

ddt$index = NULL
ddt[,index:= 1:nrow(.SD), by=Unit]
> ddt
   Unit Anything index
1:    A      3.4     1
2:    A      6.9     2
3:   A1      1.1     1
4:   A1      2.2     2
5:    B      2.0     1
6:    B      3.0     2
person Señor O    schedule 27.08.2014

Попробуй это:

ddt[, index := as.numeric(seq_len(.N)), by="Unit"]
ddt

   Unit Anything index
1:    A      3.4     1
2:    A      6.9     2
3:   A1      1.1     1
4:   A1      2.2     2
5:    B      2.0     1
6:    B      3.0     2
person Andrie    schedule 27.08.2014
comment
используйте .N вместо этого length приспособления - person eddi; 27.08.2014
comment
@ eddi: Не могли бы вы ввести это как ответ. - person rnso; 27.08.2014