2015-04-06 64 views
1

我无法使用一致的语法在data.table中获得一致的输出。见下面的例子data.table中的所有列进行分组时出现奇怪的data.table

d<- data.table(x=c(1,1,2,2), y=c(1,1,2,2)) 
# data.table shown below 
# x y 
1: 1 1 
2: 1 1 
3: 2 2 
4: 2 2 

d[, if (.N>1) .SD else NULL, by = .(x, y)] 
# returns Empty data.table (0 rows) of 2 cols: x,y 

.SD包含所有列不grouped_by,造成2个空data.frames被returned.When一个添加另一列/所述data.table包含列不被,则返回正确的输出分组。

d[, if (.N>1) .SD else NULL, by = x] 
    # returns 
     x y 
    1: 1 1 
    2: 1 1 
    3: 2 2 
    4: 2 2 
    d<- data.table(x=c(1,1,2,2), y=c(1,1,2,2), t= 1:4) 
    d[, if (.N>1) .SD else NULL, by = .(x, y)] 
    # returns 
     x y t 
    1: 1 1 1 
    2: 1 1 2 
    3: 2 2 3 
    4: 2 2 4 

我试图找到一种方式来编写代码,返回出现重复的时间,对于这两种,其中按列和不包括在data.table所有列的情况下工作的行。为此,我尝试设置.SDcols = C(“X”,“Y”),然而,列得到重复输出

d[, if (.N>1) .SD else NULL, by = .(x, y), .SDcols = c("x", "y")] 
    x y x y 
1: 1 1 1 1 
2: 1 1 1 1 
3: 2 2 2 2 
4: 2 2 2 2 

有没有办法让它尽量d [,如果( .N> 1).SD else NULL,by = colnames]返回所需的输出,而不管列名是否由d中的所有列组成。或者我需要使用if语句并分解2个案例?

+5

'.SD'是一个空的data.table,如果在'by'中使用了所有的列。 – Roland

+0

这里有一种实现你的目标的方法:'d [,rep(.N> 1,.N),by =。(x,y)] [(V1)] [,V1:= NULL]'。这适用于您当前的情况。或者,您应该设置密钥,确定要保留和合并的组。 – Frank

+0

罗兰评论完美地描述了你的问题。您也可以查看[简介](https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-intro-vignette.html)vignette,因为有一个'.SD'说明。 – jangorecki

回答

2

这里有一个方法

setkey(d,x,y) 
dnew <- d[d[,.N>1,by=key(d)][(V1),key(d),with=FALSE]] 

  1. (x,y)的关键;
  2. 确定哪些组满足标准;然后
  3. d中选择这些组。
+1

我最终选择了if语句方法。 – k13