2016-05-29 84 views
2

我想为数据表中的每个因子选择前几行。如何为数据表中的每个因子选择n个第一行?

SOURCE=data.table(NAME=rep(paste0("NAME", as.character(1:3)), each=5), VALUE=sample(c(TRUE,FALSE), 5*3, TRUE)) 
> SOURCE 
    NAME VALUE 
1: NAME1 TRUE 
2: NAME1 TRUE 
3: NAME1 TRUE 
4: NAME1 FALSE 
5: NAME1 FALSE 
6: NAME2 TRUE 
7: NAME2 FALSE 
8: NAME2 TRUE 
9: NAME2 TRUE 
10: NAME2 TRUE 
11: NAME3 TRUE 
12: NAME3 FALSE 
13: NAME3 FALSE 
14: NAME3 TRUE 
15: NAME3 TRUE 

比如这里我想选择每个NAME 3个第一排,所以我最终会与行:1-3,6-9和11-13。任何想法如何做到这一点?

我试过,但它不工作:

> SOURCE[1:3, VALUE, by=NAME] 
    NAME VALUE 
1: NAME1 TRUE 
2: NAME1 TRUE 
3: NAME1 TRUE 
+3

'SOURCE [,head(.SD,3),by = NAME]'? (另外:'set.seed()'是你重复性的朋友) – hrbrmstr

+0

另一个重复目标:http://stackoverflow.com/q/16325641/ – Frank

回答

3

这看起来像它应该这样做。基本上同样的事情@ hrbrmstr在评论的答案,但不使用head功能:

set.seed(1) 
SOURCE=data.table(NAME=rep(paste0("NAME", as.character(1:3)), each=5), VALUE=sample(c(TRUE,FALSE), 5*3, TRUE)) 

SOURCE[,.SD[1:3], by=NAME] 
    NAME VALUE 
1: NAME1 TRUE 
2: NAME1 TRUE 
3: NAME1 FALSE 
4: NAME2 FALSE 
5: NAME2 FALSE 
6: NAME2 FALSE 
7: NAME3 TRUE 
8: NAME3 TRUE 
9: NAME3 FALSE 
+1

对于它的价值,优化计划为'.SD [int_vec]但不是'head(.SD,n)',看起来像https://github.com/Rdatatable/data.table/issues/735 – Frank

4

我们可以排索引(.I),以及以子尝试。

SOURCE[SOURCE[, .I[1:3], by = NAME]$V1]