4

次のdata.tableがあります。

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 を 2 つにサブセット化したい。基準は、各グループ (この場合は列 "id") の前半を 1 つのデータ テーブルに置き、残りを別の data.table に置くことです。したがって、期待される結果は次の 2 つの 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

.Idata.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

動作するはずです

3 つ以上のグループの場合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.Ni-expression(つまり の最初の引数[) で使用できないため、親data.table.Iand.Nが使用されている (つまりdt) ためです。

于 2013-08-16T15:06:26.307 に答える