私は非エクイにby =
で.SD
の機能を組み合わせたい参加:指定した列(結合後)の各グループの最初のn行を選択する方法は?
data.table - select first n rows within group
例データ:
今tmp_dt1<- data.table(grp = c(1,2), time = c(0.2, 0.6, 0.4, 0.8, 0.25, 0.65))
tmp_dt2 <- data.table(grp = c(1,2), time_from = c(0.1, 0.5))
tmp_dt2 <- tmp_dt2[, time_to := time_from + 0.2]
> tmp_dt1
grp time
1: 1 0.20
2: 2 0.60
3: 1 0.40
4: 2 0.80
5: 1 0.25
6: 2 0.65
> tmp_dt2
grp time_from time_to
1: 1 0.1 0.3
2: 2 0.5 0.7
、私の所望の出力がありますtmp_dt2
で定義された範囲内にある各グループの最初の時間。しかし、私はチェイニングせずに、いくつかのトラブルby
を使用して、各grp
から最初のn行を抽出を抱えてい
> tmp_dt1[tmp_dt2, .(grp, time = x.time, time_from, time_to), on = .(grp, time >= time_from, time <= time_to)]
grp time time_from time_to
1: 1 0.20 0.1 0.3
2: 1 0.25 0.1 0.3
3: 2 0.60 0.5 0.7
4: 2 0.65 0.5 0.7
:私は、すべてのそのような時間を得ることができます。例として、n = 1
は、所望の出力があるとき:
tmp_dt1[tmp_dt2, .(grp, time = x.time, time_from, time_to),
on = .(grp, time >= time_from, time <= time_to)][, .SD[1], by = grp]
grp time time_from time_to
1: 1 0.2 0.1 0.3
2: 2 0.6 0.5 0.7
しかし、何かのように:
> tmp_dt1[tmp_dt2, .(time = x.time[1], time_from[1], time_to[1]), on = .(grp, time >= time_from, time <= time_to), by = grp]
Error in `[.data.table`(tmp_dt1, tmp_dt2, .(time = x.time[1], time_from[1], :
object 'time_from' not found
は動作しません。
使用して、.SD
は近づくが、選択された列の面で私の結果の混乱終わりを与える:
tmp_dt1[tmp_dt2, .SD[1], on = .(grp, time >= time_from, time <= time_to), by = grp]
grp time
1: 1 0.2
2: 2 0.6
私はチェーンでそれを行うにはしたくない理由があるためmemory issuesです。私はこの特定の問題をdata.table
パッケージで解決することにのみ関心があることに注意してください。
この回答と、 'x.'表記を説明する非常に役に立つリンクに感謝します – Alex