data.table中所有列分组时的奇怪data.table行为

时间:2015-04-06 16:50:42

标签: r 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包含所有未分组的列,导致返回2个空data.frames。当一个添加另一列/ 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

我试图找到一种方法来编写代码来返回出现重复次数的行,这些行既适用于by列的情况,也不适用于data.table中的所有列。为此,我尝试设置.SDcols = c(&#34; x&#34;,&#34; y&#34;),然而,列在输出中重复

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 [,if(.N&gt; 1).SD else NULL,by = colnames]返回所需的输出,而不管列名是否由d中的所有列组成?或者我是否需要使用if语句并分解2个案例?

1 个答案:

答案 0 :(得分:2)

这是一种方法

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

这个

  1. (x,y)设置为密钥;
  2. 确定哪些(x,y)组符合标准;然后
  3. d
  4. 中选择这些群组