2016-03-26 76 views
5

我在r中計數數,通過

col1 col2 col3 col4 
1: 5.1 3.5 1.4 setosa 
2: 5.1 3.5 1.4 setosa 
3: 4.7 3.2 1.3 setosa 
4: 4.6 3.1 1.5 setosa 
5: 5.0 3.6 1.4 setosa 
6: 5.1 3.5 3.4 eer 
7: 5.1 3.5 3.4 eer 
8: 5.1 3.2 1.3 eer 
9: 5.1 3.5 1.5 eer 
10: 5.1 3.5 1.4 eer 


DT <- structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 5.1, 
5.1, 5.1), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.5, 
3.5), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 1.4 
), col4 = structure(c(1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L), .Label = c("setosa", 
"versicolor", "virginica", "eer"), class = "factor")), .Names = c("col1", 
"col2", "col3", "col4"), row.names = c(NA, -10L), class = c("data.table", 
"data.frame")) 

具有data.table欲用於col4每個值計數的col1col2獨特(不同)的組合。

預計產量

col1 col2 col3 col4 count 
1: 5.1 3.5 1.4 setosa  4 
2: 5.1 3.5 1.4 setosa  4 
3: 4.7 3.2 1.3 setosa  4 
4: 4.6 3.1 1.5 setosa  4 
5: 5.0 3.6 1.4 setosa  4 
6: 5.1 3.5 3.4 eer  2 
7: 5.1 3.5 3.4 eer  2 
8: 5.1 3.2 1.3 eer  2 
9: 5.1 3.5 1.5 eer  2 
10: 5.1 3.5 1.4 eer  2 

我怎麼能只有1個data.table語法做到這一點?

+0

這裏有一些其他的,非data.table方式:http://stackoverflow.com/questions/17421776/how-以獨特的價值逐個添加數量的數據框 – Frank

回答

13

我不得不經過幾次嘗試,並以此結束。有什麼好處?

DT[, count:=nrow(unique(.SD)), by=col4, .SDcols=c("col1","col2")] 
DT 
    col1 col2 col3 col4 count 
1: 5.1 3.5 1.4 setosa  4 
2: 5.1 3.5 1.4 setosa  4 
3: 4.7 3.2 1.3 setosa  4 
4: 4.6 3.1 1.5 setosa  4 
5: 5.0 3.6 1.4 setosa  4 
6: 5.1 3.5 3.4 eer  2 
7: 5.1 3.5 3.4 eer  2 
8: 5.1 3.2 1.3 eer  2 
9: 5.1 3.5 1.5 eer  2 
10: 5.1 3.5 1.4 eer  2 
> 

和相同的,但由於速度低於Procrastinatus評論:

DT[, count:=uniqueN(.SD), by=col4, .SDcols=c("col1","col2")] 
+1

我很驚訝你沒有使用'uniqueN'。任何具體原因? – Jaap

+0

是的......阿倫一直在前進,我忘記了唯一的N!尼斯。看看它,我們應該設置它的'by = NULL',以防''col'由'col1'鍵入'DT'嗎? –

+0

當我嘗試時,這隻會給'col1'中唯一值的計數(這不是OP想要的)。順便說一句:關於速度,似乎使用'length(unique())'[仍然比'uniqueN'快](http://stackoverflow.com/questions/34007199/frequency-of-rows-by-id )在大型數據集上。 – Jaap