2013-04-13 103 views
0

我对R还是很新的,最近遇到了一些我不确定它的含义。 data.framedata.table有相同的类型吗?对象可以有多种类型?在将“cars”从data.frame转换为data.table后,我显然不能使用适用于data.frames而不是data.table的函数,但class()显示“cars”仍然是data.frame。有人知道为什么data.frame和data.table的R对象是否具有相同的类型?

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

一个相关的问题http://stackoverflow.com/questions/13618488/what-you-can-do -with数据帧,也就是说,你-着,在数据表 – mnel

回答

3

Data.table和data.frame是不同的类,但它们通过继承关联。 Data.table inherits from data.frame,并且基本上扩展了它的功能。你也可以看到,汽车转换到data.table课后:

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

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

更多信息here或只是谷歌“遗产”。

3

目前还不清楚你的意思是“我显然不能应用适用于data.frames而不适用于data.table的函数”。

许多功能按照您的预期工作,无论是应用于data.frame还是应用于data.table。特别是,如果你读的帮助页?data.table,你会发现在说明书的第一段这个特定的行:

由于data.table一个data.frame,它是有R的功能和封装兼容是only接受data.frame

您可以测试这一点你自己:

library(data.table) 
CARS <- data.table(cars) 

下都应该给你相同的结果。他们不是“数据表”的做事方式,但我刚从我的脑海中弹出一些东西来向你展示许多(大多数?)函数可以与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] 

为了更好地理解这一点,我建议您阅读常见问题。特别是在这个问题上总结了几个相关的问题:what you can do with data.frame that you can't in data.table


如果你的问题是更普遍,“可以将对象有多个类?”,那你就是从自己的探索,是的,它可以看到。欲了解更多信息,你可以阅读this page from Hadley's 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 
相关问题