9

numeric出力を変更するために、自分のクラスをにアタッチしようとしましたformat。これは正常に機能しますが、グループをby作成すると、クラスは数値に戻ります。

例:クラスの新しいフォーマット関数を定義します。

format.myclass <- function(x, ...){
  paste("!!", x, "!!", sep = "")
}

次に、小さくdata.tableして、列の1つをmyclassに変更します。

> DT <- data.table(L = rep(letters[1:3],3), N = 1:9)
> setattr(DT$N, "class", "myclass")
> DT
   L     N
1: a !!1!!
2: b !!2!!
3: c !!3!!
4: a !!4!!
5: b !!5!!
6: c !!6!!
7: a !!7!!
8: b !!8!!
9: c !!9!!

ここでgroupbyを実行すると、N列が整数に戻ります。

> DT[, .SD, by = L]
   L N
1: a 1
2: a 4
3: a 7
4: b 2
5: b 5
6: b 8
7: c 3
8: c 6
9: c 9

> DT[, sapply(.SD, class), by = L]
   L      V1
1: a integer
2: b integer
3: c integer

なぜですか?

4

2 に答える 2

8

Rがベクトルをサブセット化するときはいつでも、クラスを捨てるだけだからです。なんで?まあ、それはaRseなので、それが理由です。"["-subset メソッドを記述する必要があります。

> DT[,N]
[1] 1 2 3 4 5 6 7 8 9
attr(,"class")
[1] "myclass"
> DT[1:2,N]
[1] 1 2

ベクトルのサブセット化によってクラスが削除されたことがわかりますか? それが問題です。data.table は、ベクターに対してある時点でこれを行っています。"[" メソッドを記述します (Date が使用するメソッドをコピーするだけです)。

"[.myclass"= function (x, ..., drop = TRUE){
    cl <- oldClass(x)
    class(x) <- NULL
    val <- NextMethod("[")
    class(val) <- cl
    val
}

> DT[1:2,N]
[1] 1 2
attr(,"class")
[1] "myclass"

そして今、いくつかのクラスがあります。これにより、最後の行も sapply で修正されます。

> DT[, sapply(.SD, class), by = L]
   L      V1
1: a myclass
2: b myclass
于 2013-02-07T15:06:16.187 に答える