data.frame和data.table的R对象有相同的类型吗?

use*_*970 2 r dataframe data.table

我对R来说还是很新的,最近发现了一些我不确定它意味着什么.data.framedata.table有相同的类型?一个对象可以有多种类型吗?将"汽车"转换data.frame为后data.table,我显然无法应用适用于data.frames和不适用的功能data.table,但class()显示"汽车"仍然是一个data.frame.谁知道为什么?

> class(cars)
[1] "data.frame"
> cars<-data.table(cars)
> class(cars)
[1] "data.table" "data.frame"
Run Code Online (Sandbox Code Playgroud)

A5C*_*2T1 5

你不清楚你的意思是什么意思"我显然不能应用适用于data.frames而不是data.table的函数".

无论是应用于a data.frame还是a ,许多函数都可以正常工作data.table.特别是,如果您阅读帮助页面?data.table,您会在说明的第一段中找到此特定行:

由于a data.table a data.frame,它与R函数和only接受的包兼容data.frame.

你可以自己测试一下:

library(data.table)
CARS <- data.table(cars)
Run Code Online (Sandbox Code Playgroud)

以下都应该给你相同的结果.它们不是"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, ]
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下这不起作用.相比:

cars[cars$speed == 4, 1]
CARS[CARS$speed == 4, 1]
Run Code Online (Sandbox Code Playgroud)

为了更好地理解这一点,我建议您阅读常见问题解答.特别是,在这个问题上总结了几个相关的要点:你可以用data.frame做什么,你不能在data.table中.


如果你的问题更普遍地说是"一个对象可以有一个以上的类吗?"那么你从自己的探索中看到,是的,它可以.有关更多信息,您可以从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"
Run Code Online (Sandbox Code Playgroud)

由于每个列表项的长度相同,您可能希望可以方便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
Run Code Online (Sandbox Code Playgroud)

或者,让我们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
Run Code Online (Sandbox Code Playgroud)