4

次のものがあるとしますdata.table

dt <- data.table(id=c(1,1,1,1,1,1,2,2,2,2),
           wday=c("mon","tue","wed","thu","fri","sat","mon","tue","thu","fri"),
           val=c(2,3,5,8,6,2,3,4,2,6))

    id wday val
 1:  1  mon   2
 2:  1  tue   3
 3:  1  wed   5
 4:  1  thu   8
 5:  1  fri   6
 6:  1  sat   2
 7:  2  mon   3
 8:  2  tue   4
 9:  2  thu   2
10:  2  fri   6

これは、別の の集計の結果ですdata.table。これは、異なる個人 ( )valの曜日 ( ) に応じた変数のカウント ( ) を表します。問題は、操作中にカウントが 0 になる曜日を失ったことです。wdayid

問題はdata.table、各 ID に対して、欠落している曜日と同じ数の行を挿入して、オブジェクトを効率的に更新するにはどうすればよいかということval=0です。

結果は次のようになります。

    id wday val
 1:  1  mon   2
 2:  1  tue   3
 3:  1  wed   5
 4:  1  thu   8
 5:  1  fri   6
 6:  1  sat   2
 7:  1  sun   0
 8:  2  mon   3
 9:  2  tue   4
10:  2  wed   0
11:  2  thu   2
12:  2  fri   6
13:  2  sat   0
14:  2  sun   0

どうもありがとうございました。

4

2 に答える 2

2

今考えられる簡単な方法の 1 つは、 を使用expand.gridしてすべての組み合わせを取得し、それを使用して でサブセット化することallow.cartesian = TRUEです。

setkey(dt, "id", "wday")
vals <- c("mon", "tue", "wed", "thu", "fri", "sat", "sun")
idx <- expand.grid(vals, unique(dt$id))[, 2:1]
dt[J(idx), allow.cartesian=TRUE]

#     id wday val
#  1:  1  mon   2
#  2:  1  tue   3
#  3:  1  wed   5
#  4:  1  thu   8
#  5:  1  fri   6
#  6:  1  sat   2
#  7:  1  sun  NA
#  8:  2  mon   3
#  9:  2  tue   4
# 10:  2  wed  NA
# 11:  2  thu   2
# 12:  2  fri   6
# 13:  2  sat  NA
# 14:  2  sun  NA

idxまたは、以下を使用してデータ テーブルを直接作成することもできCJます。

dt[CJ(unique(dt$id),vals), allow.cartesian=TRUE]
于 2013-05-13T09:27:21.203 に答える