4

我有以下数据表。

ts,id
1,a
2,a
3,a
4,a
5,a
6,a
7,a
1,b
2,b
3,b
4,b

我想将此 data.table 分成两个子集。标准是每个组的前半部分(在本例中为“id”列)在一个数据表中,其余部分在另一个 data.table 中。所以预期的结果是两个data.tables如下

ts,id
1,a
2,a
3,a
4,a
1,b
2,b

 ts,id
 5,a
 6,a
 7,a
 3,b
 4,b

我尝试了以下,

z1 = x[,.SD[.I < .N/2,],by=dev]
z1

并得到以下

id ts
a  1
a  2
a  3

不知何故,.SD 中的 .I 并没有按照我认为的方式工作。任何帮助表示赞赏。提前致谢。

4

2 回答 2

6

.I给出相对于整个 data.table 的行位置. 因此它不能在.SD.

就像是

DT[, subset := seq_len(.N) > .N/2,by='id']

subset1 <- DT[(subset)][,subset:=NULL]
subset2 <- DT[!(subset)][,subset:=NULL]

subset1
#    ts id
# 1:  4  a
# 2:  5  a
# 3:  6  a
# 4:  7  a
# 5:  3  b
# 6:  4  b
subset2
#   ts id
# 1:  1  a
# 2:  2  a
# 3:  3  a
# 4:  1  b
# 5:  2  b

应该管用

对于超过 2 个组,您可以使用cut创建一个具有适当数量级别的因子

就像是

 DT[, subset := cut(seq_len(.N), 3, labels= FALSE),by='id']
 # you could copy to the global environment a subset for each, but this 
 # will not be memory efficient!
 list2env(setattr(split(DT, DT[['subset']]),'names', paste0('s',1:3)), .GlobalEnv)
于 2013-08-16T04:20:45.787 回答
2

这是您的表达式的更正版本:

dt[, .SD[, .SD[.I <= .N/2]], by = id]
#   id ts
#1:  a  1
#2:  a  2
#3:  a  3
#4:  b  1
#5:  b  2

你不工作的原因是因为.Iand在(即 的第一个参数).N中不可用,因此使用了父级的and (即's )。i-expression[data.table.I.Ndt

于 2013-08-16T15:06:26.307 回答