「data.tableではなくdata.framesに適用される関数を明らかに適用できない」という行の意味が明確ではありません。
data.frame
多くの関数は、 に適用されても に適用されても、期待どおりに機能しますdata.table
。特に、ヘルプ ページを に読む?data.table
と、説明の最初の段落に次の特定の行が見つかります。
adata.table
は であるため、 を受け入れるdata.frame
R 関数およびパッケージと互換性があります。only
data.frame
これを自分でテストできます:
library(data.table)
CARS <- data.table(cars)
以下はすべて同じ結果をもたらすはずです。それらは「data.table」の方法ではありませんが、多くの (ほとんどの?) 関数をdata.table
同じ方法で使用できることを示すために、頭のてっぺんからいくつかのことを取り出しました。それらを一緒に使用しますdata.frame
(ただし、その時点で、提供する必要があるすべての優れたものを見逃していdata.table
ます).
with(cars, tapply(dist, speed, FUN = mean))
with(CARS, tapply(dist, speed, FUN = mean))
aggregate(dist ~ speed, cars, as.vector)
aggregate(dist ~ speed, CARS, as.vector)
colSums(cars)
colSums(CARS)
as.matrix(cars)
as.matrix(CARS)
t(cars)
t(CARS)
table(cut(cars$speed, breaks=3), cut(cars$dist, breaks=5))
table(cut(CARS$speed, breaks=3), cut(CARS$dist, breaks=5))
cars[cars$speed == 4, ]
CARS[CARS$speed == 4, ]
ただし、これが機能しない場合もあります。比較:
cars[cars$speed == 4, 1]
CARS[CARS$speed == 4, 1]
それをよりよく理解するために、よくある質問を読むことをお勧めします。特に、いくつかの関連するポイントがこの質問にまとめられています: data.table ではできない data.frame でできること。
あなたの質問が、より一般的には「オブジェクトは複数のクラスを持つことができますか?」である場合、あなた自身の調査から、はい、可能であることがわかりました。詳細については、Hadley の devtools wiki からこのページを読むことができます。
クラスは、オブジェクトがどのように印刷されるか、他の関数とどのように相互作用するかなどにも影響を与えます。
rle
関数を考えてみましょう。を見るとclass
「rle」が返ってきて、その構造を見るとstr
リストであることがわかります。
> x <- rev(rep(6:10, 1:5))
> y <- rle(x)
> x
[1] 10 10 10 10 10 9 9 9 9 8 8 8 7 7 6
> y
Run Length Encoding
lengths: int [1:5] 5 4 3 2 1
values : int [1:5] 10 9 8 7 6
> class(y)
[1] "rle"
> str(y)
List of 2
$ lengths: int [1:5] 5 4 3 2 1
$ values : int [1:5] 10 9 8 7 6
- attr(*, "class")= chr "rle"
各リスト項目の長さは同じであるため、 を使用して簡単data.frame()
にdata.frame
. やってみよう:
> data.frame(y)
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) :
cannot coerce class ""rle"" to a data.frame
> unclass(y)
$lengths
[1] 5 4 3 2 1
$values
[1] 10 9 8 7 6
> data.frame(unclass(y))
lengths values
1 5 10
2 4 9
3 3 8
4 2 7
5 1 6
class
または、オブジェクトに別のものを追加して試してみましょう。
> class(y) <- c(class(y), "list")
> y ## Printing is not affected
Run Length Encoding
lengths: int [1:5] 5 4 3 2 1
values : int [1:5] 10 9 8 7 6
> data.frame(y) ## But interaction with other functions is
lengths values
1 5 10
2 4 9
3 3 8
4 2 7
5 1 6