R是一门著名的可用于数据和统计分析的程序语言,本文翻译自R软件官方文档教程《An Introduction to R》,仅供学习和参考。
3 对象的模式和属性
3.1固有属性:类型(mode)和长度(length)
R 操作的实体在技术上称为对象object
。数值向量、复数向量、逻辑向量、字符串向量等都是对象。这些对象的结构被称为“原子atomic
”结构,因为它们的组成部分都是同种类型mode
,即numeric
、complex
、logical
、character
和raw
。
向量的值必须全部属于同一类型。因此,任何给定的向量必须明确地是逻辑型、数字型、复数型、字符型或原始型的其中一个。(唯一的例外是特殊的“值”,即用于表示不可用数量的 NA
,但实际上有几种类型的 NA
)。请注意,向量可以为空但仍具有类型。例如,空的字符串向量用 character(0)
表示,空的数值向量用 numeric(0)
表示。
R也可以操作称为列表list
的对象,这些对象的类型为list
。它们是有序的对象序列,每个对象本身可以是任何类型。 “列表”被称为“递归recursive
”而不是原子结构,因为它们的组成部分本身也可以是列表。
其他递归结构包括函数function
和表达式expression
。函数是R系统的组成部分,大量内置函数和用户编写的函数一起构成R系统。后文将对此进行详细讨论。表达式作为对象构成了R的高级部分,在本教程中不会直接讨论,仅在讨论R中的建模公式formulae
时间接提到。
对象的类型,指的就是其基本成分的数据类型。这是对象的一个特殊属性property
/attribute
。除此之外,每个对象还具有另一个属性,即长度length
。函数 mode(object)
和 length(object)
可以用于显示任何对象的类型和长度。
对象的其他属性通常通过attributes(object)
函数查看。模式和长度被称为对象的“固有属性“intrinsic attributes
。
例如,若 z
是长度为 100 的复数向量,则mode(z)
为字符串"complex"
,而length(z)
的值为100。
R 可以几乎可以进行任何合理的类型转换(虽然有时候也会很不合理)。你可以使用as.<modeName>(object)
函数进行显式转换。
> z<-0:9 # numeric型向量
> mode(z)
[1] "numeric"
> str_z<-as.character(z)
> str_z
[1] "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" # character型向量
> mode(str_z)
[1] "character"
> num_z<-as.numeric(str_z) # numeric型向量
> num_z
[1] 0 1 2 3 4 5 6 7 8 9
> mode(num_z)
[1] "numeric"
3.2 改变对象的长度
一个“空”对象仍可能具有类型。例如e <- numeric()
让 e
成为一个类型为 numeric
的空向量。类似地,character()
是一个空的字符向量。
任何长度的对象被创建后,只需要用一个超出长度范围的索引来进行赋值就能拉长向量。因此e[3] <- 17
使得 e
成为一个长度为 3 的向量(此时的前两个元素未被指定,均为 NA
,第3个元素为17)。这适用于任何对象,只要新加的元素的类型和对象的类型相符即可。
这种对象长度的自动调整经常用于与输入相关的scan()
函数中。
相反,要缩短对象的长度,只需要通过索引再进行一次赋值。因此,如果alpha
是一个长度为10的对象,则alpha <- alpha[2 * 1:5]
将它变成一个长度为5的对象,只包括索引为偶数的元素。
我们也可以通过length(alpha) <- 3
来只保留前三个元素。向量也可以通过同样的方式来增加长度,这时增加的元素将为NA
。
3.3 获取和设置属性
函数attributes(object)
返回一个列表,其中包含当前为该对象定义的所有非内在属性。函数attr(object, name)
可用于获取或设置特定属性。这些函数很少使用,除非在某些特殊情况下需要创建一些新的属性以实现某些特定目的,例如创建日期或运算符与R对象关联起来的情况。然而,该概念非常重要。在R中,属性是对象的组成部分,因此分配或删除属性时应谨慎处理。
当在赋值的左侧使用时,它可用于将新属性与对象关联或更改现有属性。例如:attr(z, "dim") <- c(10,10)
,将z
的dim
(维数属性)设置为c(10,10)
。这将允许R将z
视为10x10矩阵。
3.4 对象的所属类
R 中的每个对象都会所属于一个类class
,用class(object)
函数可以查看。对于简单的向量,它们的类就是他们的类型,例如 numeric
、logical
、character
或list
。但matrix
、factor
和data.frame
就不一样了。
类是对象的一个特殊属性。类,允许了在 R 中可以出现面向对象的编程风格 。例如,如果一个对象具有类data.frame
,它将会被以某种特殊方式打印,plot( )
函数将能以图形方式显示它。所谓的通用函数(例如summary()
),将会对特定的类的对象采取特定的行为。
要暂时消除类的影响,请使用函数 unclass()
。例如,如果 winter
所属于类data.frame
,那么winter
将以数据框形式打印它,这更像是一个矩阵,而unclass(winter)
会将其打印为普通列表形式。只有在相当特殊的情况下才需要使用此函数,其中一种情况是当您正在学习和理解类和通用函数的概念时。
通用函数和类将在后续内容中进一步讨论,但也只是简要讨论。