3

私はまだRに非常に慣れていないので、最近、それが何を意味するのかわからないことに出くわしました。data.framedata.table同じタイプを持っていますか?オブジェクトは複数のタイプを持つことができますか? 「cars」を からdata.frameに変換した後、 に適用され、 に適用されないdata.table関数を適用できないことは明らかですが、「cars」がまだ. 理由を知っている人はいますか?data.framesdata.tableclass()data.frame

> class(cars)
[1] "data.frame"
> cars<-data.table(cars)
> class(cars)
[1] "data.table" "data.frame"
4

2 に答える 2

6

「data.tableではなくdata.framesに適用される関数を明らかに適用できない」という行の意味が明確ではありません。

data.frame多くの関数は、 に適用されても に適用されても、期待どおりに機能しますdata.table。特に、ヘルプ ページを に読む?data.tableと、説明の最初の段落に次の特定の行が見つかります。

adata.table は であるため、 を受け入れるdata.frameR 関数およびパッケージと互換性があります。onlydata.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
于 2013-04-13T09:20:23.160 に答える
3

Data.table と data.frame は異なるクラスですが、継承によって関連付けられています。Data.tableは data.frameを継承し、基本的にその機能を拡張します。また、cars を data.table クラスに変換すると、次のようになります。

R> typeof(cars)
[1] "list"      # similar to dataframe

R> mode(cars)
[1] "list"      # idem

詳細については、こちらを参照するか、「継承」をグーグルで検索してください。

于 2013-04-13T07:29:26.977 に答える