2016-03-26 56 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