按 data.table 中的所有列进行分组时,.SD 为空

2024-05-04

我无法获得一致的输出data.table使用一致的语法。请参阅下面的示例

library(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

当所有列都用于分组时by, .SD为空,导致空data.table被退回。

当添加另一列时,.SD包含未分组的列,则返回正确的输出。

   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[, if(.N > 1) .SD else NULL, by = colnames]返回所需的输出,与分组的列名是否包含“d”中的所有列无关?或者我需要使用if声明并分解这两个案件?


这是一种方法

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

This

  1. sets (x,y)到一把钥匙;
  2. 识别哪个(x,y)组满足标准;进而
  3. 从中选择这些组d.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按 data.table 中的所有列进行分组时,.SD 为空 的相关文章

随机推荐