在R中,Class()函数返回多个类名。

11

大家好,我是R的初学者。我对于R中类别的组织方式不太熟悉。我注意到有些class()调用返回一个类别,而另一些调用则返回多个类别名称。

示例1

{我的对象名称是“sassign”} 这是我的数据:

 acctnum gender state   zip zip3 first last book_ nonbook_ total_ purch child youth cook do_it refernce art geog buyer
1   10001      M    NY 10605  106    49   29   109      248    357    10     3     2    2     0        1   0    2    no
2   10002      M    NY 10960  109    39   27    35      103    138     3     0     1    0     1        0   0    1    no
3   10003      F    PA 19146  191    19   15    25      147    172     2     0     0    2     0        0   0    0    no
4   10004      F    NJ 07016  070     7    7    15      257    272     1     0     0    0     0        1   0    0    no
5   10005      F    NY 10804  108    15   15    15      134    149     1     0     0    1     0        0   0    0    no
6   10006      F    NY 11366  113     7    7    15       98    113     1     0     1    0     0        0   0    0   yes

现在,如果我在上面输入class(object),我会得到:

class(sassign)
[1] "data.frame"

我对这个很满意。我明白这个数据结构属于数据框架类型。

例子2 最近我发现了Wickham的tibbleR包。 以下是我将数据框架转换为Tibble的方法:

tib_sassign<-as_data_frame(sassign)
class(tib_sassign)
[1] "tbl_df"     "tbl"        "data.frame"

我在这里迷失了方向。我不知道tbl_df和tbl之间的区别。然而,我的假设是tibble软件包通过返回对象(类似于抽象类)使我们的生活更加轻松,可以用作tibble(“tbl”)、数据框(“data.frame”)或tbl_df(我不知道tbl_df是什么意思)。我阅读了dplyr软件包的在线pdf,但我认为他们没有解释清楚这个问题。我相信他们认为人们知道上面提到的内容是什么意思。

我阅读了RStudio关于https://blog.rstudio.org/2016/03/24/tibble-1-0-0/的博客,但我认为他们没有描述清楚上述输出的含义。我也阅读了Norman Matloff的书,但我认为书中没有涉及到这个问题。 我还在谷歌上搜索了"tbl_df""tbl""data.frame",但大多数结果都涉及某些代码出现问题,并没有解释上述输出的含义。

示例3 我现在开始研究R中的时间序列。这就是我不得不开这个帖子的原因。 以下是我所做的:

t_sassign <-data.frame(group_by(sassign,last))
t_sassign<-ts(t_sassign,start = c(2014,1),frequency = 12)
class(t_sassign)
[1] "mts"    "ts"     "matrix"

在这里,“last”是月份的数量。虽然我相信我会以某种方式完成我需要做的事情,但我仍然不明白上面的结果意味着什么。

我还在StackOverflow上搜索过,但大多数结果都是关于在JAVA中返回Class的讨论。

我有三个问题:

问题1) 如果有人能提供一个例子,那就太棒了,这样我就可以理解class()的输出。

问题2) 如果有人能提供一个运用问题1中讨论的概念的代码片段,那我将非常感激。这样,我就能永远记住这个概念了。

问题3) 如果您知道一本涉及这些概念的书籍,我会很感激。我正在跟随Kabackoff的《R in Action》、Norman Matloff的《R》和StackOverflow。

非常感谢您的帮助。


(补充)下面还有另一件令人困惑的事情:

AP<-AirPassengers
class(AP)
[1] "ts"

我得到了"class type"为"ts",但继承类没有显示。我真的很迷惑,请帮帮我!


1
我认为这个问题不太适合在这里讨论,因为它是关于 R 的一个基本概念的广泛性问题;但是,你可以在这里阅读有关 class 返回值的内容:http://adv-r.had.co.nz/S3.html - Konrad Rudolph
2
class 函数在 R 中的理念是提供一种面向对象的编程风格。在 R 对象上调用 class 函数会返回该对象所包含的所有类(即其直接类以及直接类所继承的所有类)。例如,当您将普通的 data.frame(一个本地 R 对象)强制转换为 tbl_df 时,您正在将其直接类从 data.frame 更改为 tbl_df。 您可以使用 inherits 函数检查 R 对象是否继承自某个类。 - Abdou
1
例如:inherits(as_data_frame(sassign), what = 'data.frame') 应该返回 TRUE,就像 inherits(ts(sassign), what = 'matrix') 也应该返回 TRUE - Abdou
1
在这种情况下,是的。data.frame是一个本地R对象,tbltbl_df都建立在其之上。我没有设计dplyr包,但我敢说,它背后的想法是提供一个具有基本data.frame属性和额外增强功能的对象。tbl_dfdata.table都继承于data.frame。而时间序列对象则继承自矩阵对象。 - Abdou
1
考虑多态性。例如,当您将对象转储到控制台时,R首先查找print.class,其中.class是适当的类。在您的第二个示例中,它找到了print.tbl_df并打印出一些不那么占用屏幕的内容。但是,可能存在其他不知道tbl_df的多态函数,因此R接着查找(比如)print.tblprint.data.frame,使用它找到的第一个。如果什么都没有找到,它就使用print.default。通过拥有多个类,所有类都将被搜索以寻找适当的方法。 - r2evans
显示剩余4条评论
1个回答

4
这不是基于R的基本功能,而是通常被称为“hadleyverse”的特殊功能。Hadley设计了dplyr软件包,以处理特殊版本的数据帧。请参阅:http://www.rdocumentation.org/packages/tibble/versions/1.1/topics/tibble-package,了解tbl_df类的描述。该类具有与那些通常处理数据帧的base-R函数不同的print、"["和"[["版本。有不同的打印格式和规则,$[[永远不会进行部分名称匹配,并且子集始终返回一个data.frame。
关于tbl-class的单独描述。到目前为止,我发现应该查看dplyr软件包文档,因为它具有as.tbl和针对不同类型数据源(如SQL服务器)的不同方法的描述。
更正一下,该软件包的名称不是tibbleR
回答您的最后一个问题(请注意,SO不赞成多个问题),您可以看到?inherits有时会告诉您对象是否是“隐式”类的成员,但并不总是如此,您可能需要使用is-函数来测试“numeric”。
> AP<-AirPassengers
> class(AP)
[1] "ts"
> inherits(AP, "matrix")
[1] FALSE
> inherits(AP, "numeric")
[1] FALSE
> str(AP)
 Time-Series [1:144] from 1949 to 1961: 112 118 132 129 121 135 148 148 136 119 ...
> inherits( as.matrix(AP), "numeric")
[1] FALSE
> inherits( as.matrix(AP), "matrix")
[1] TRUE
> str( as.matrix(AP) )
 num [1:144, 1] 112 118 132 129 121 135 148 148 136 119 ...
> inherits( as.matrix(AP), "integer")
[1] FALSE
> is.numeric( as.matrix(AP) )
[1] TRUE
> ?inherits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接