use*_*970 2 r dataframe data.table
我对R来说还是很新的,最近发现了一些我不确定它意味着什么.data.frame并data.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)
你不清楚你的意思是什么意思"我显然不能应用适用于data.frames而不是data.table的函数".
无论是应用于a data.frame还是a ,许多函数都可以正常工作data.table.特别是,如果您阅读帮助页面?data.table,您会在说明的第一段中找到此特定行:
由于a
data.table是 adata.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)