2014-08-27 54 views
0

此問題與:Add a column to a data frame that index the number of occurrences in a group 我有以下data.table按前2列排序。在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命令做到這一點?謝謝你的幫助。

回答

2

嘗試

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 
1

試試這個:

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 
+0

使用'.N'的而不是'length'玩意兒 – eddi 2014-08-27 17:11:02

+0

@ EDDI:能否請您進入這個作爲一個答案。 – rnso 2014-08-27 17:11:46

+0

@eddi謝謝你讓我的腳趾。回答編輯:-) – Andrie 2014-08-27 17:12:38

1

的一個問題是,你不能使用改變類中列的:=(因爲指數是類型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