TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
1. R对象
对象是R语言两个主要概念之一,另一个是函数。
R对象可以看作是具有关联名称的存储空间。R中的一切都存储在对象中。所有的变量、数据、函数都以命名对象的形式存储在计算机的内存中。
函数是R语言中一种特殊形式的对象,用来完成某个操作。函数可以接受一些输入参数,通过执行一系列操作产生结果。R已提供大量可用函数,用户也可以创建新的函数。
R语言中对象赋值运算符:<-,也可以是=,但为防止与相等测试混淆,不推荐用=。如给对象x赋值,R命令行直接命令:
>x <-945
这样,就把数值945存储在名为x的对象中。只要在R命令行中输入对象的名词,就能看到它的内容,如输入:
>x
[1] 945
数值前的“[1]”可以读作“此行是从对象的第一个元素开始显示的值”。这种形式看起来很眼熟,就是C、java等语言的数组形式。确实R语言中的对象可以表示向量,内含多个值,用此种表示方式非常有用。
R语言的赋值操作也是“破坏性”的,即一个对象只能有一个给定的内容。如果将新的内容分配给当前对象,则该对象先前的内容会被覆盖。举例如下:
> y <-39
>y
[1] 39
> y <-67
>y
[1] 67
R语言赋值操作支持数值表达式,此种情况下,对象存储表达式的计算结果:
> z <- 5
> w <-z^2
>w
[1] 25
>i<- (z* 2 + 45) / 2
>i
[1] 27.5
综合上述赋值运算,R语言赋值运算符都先计算右侧,然后把结果存储到左侧的对象中。
如果只想知道某些算数运算的结果,那么不需要把表达式的结果赋给对象,即可将R环境当作计算器。本人在Ubuntu下经常这么做,非常方便快捷。
> 34 + 90 /9
[1] 44
R可以将十六进制数转化为十进制数。
> 0xf
[1] 15
> 0xff
[1] 255
> 0xffff
[1] 65535
值得注意的是:创建的每个对象都存储在计算机内存中,直到删除它。可通过命令ls()或objects()列举出当前内存中的对象。
>ls()
[1]"i" "w" "x" "y" "z"
>objects()
[1]"i" "w" "x" "y" "z"
通过rm命令删除对象,可以一次删除一个,也可以一次删除多个。
>rm(y)
>rm(x,z)
>ls()
[1]"i" "w"
删除一个不存在的对象,系统会发出警告信息。
>rm(y)
Warningmessage:
In rm(y) :object "y" not found
R语言的对象名称可以包含任何大、小写字母、数字0~9(不能用于开头)以及字母相似的符号“.”。注意:R中的名称是区分大小写的,这也是导致很多初学者遇到“找不到对象”错误的一个常见原因。
2. 向量
R中最基本的对象,有模式和长度两种属性。模式指的是存储类型,长度是包含的元素数量。R的基本数据类型有:字符型、逻辑型、数值型、复数型。注意:R的字符型事实上是一组字符,而非单个字符,类似其它语言的字符串类型。逻辑值只能是T(TRUE)和F(FALSE),True或False等不是有效的逻辑值,因为R中的名称是大小写敏感的。
即使将单一数字赋值给对象,也会创建一个包含单个元素的向量,这个从前面的示例中就可以看出。
R中使用c()函数和相应的参数来创建向量,length()查看元素数量,mode()查看数据类型。
> v <-c(4, 7, 23.5, 76.2, 80)
>v
[1] 4.0 7.0 23.5 76.2 80.0
>length(v)
[1] 5
>mode(v)
[1]"numeric"
一个向量所有元素必须属于相同的模式,如果不是,会进行强制类型转换。
> v <-c(4, 7, 23.5, 76.2, 80, "rrt")
> v
[1]"4" "7" "23.5" "76.2""80" "rrt"
所有向量可以包含缺失值NA。
> u <-c(4, 6, NA, 2)
>u
[1] 4 6NA 2
> k <-c(T, F, NA, TRUE)
> k
[1] TRUE FALSE NA TRUE
可通过方括号索引访问向量中某个特定元素,也可以通过该方式改变某个特定元素值。
> v[2]
[1]"7"
> v[1]
[1]"4"
> v[1]<- "hello"
> v
[1]"hello" "7" "23.5" "76.2" "80" "rrt"
R允许创建空向量,且在不存在的索引处添加向量元素,可以改变向量长度。
> x <-vector()
>length(x)
[1] 0
>x[3] <-45
>length(x)
[1] 3
> x
[1] NA NA 45
注意:向量未知值的使用,虽然灵活,但却是有代价的:在R中使用一个不存在的向量位置,不会报错。如下示例:
>length(x)
[1] 3
> x[10]
[1] NA
> x[5]<- 4
> x
[1] NA NA 45NA 4
利用赋值运算的破坏性,可以缩短向量大小。
> v <-c(45, 243 , 78, 365, 5656, 334, 90, 23, 809)
> v
[1] 45 243 78 365 5656 334 90 23 809
> v <-c(v[5], v[7])
> v
[1] 5656 90
3. 向量化
R语言最强大功能之一是函数的向量化,即函数直接对向量的每个元素进行操作。如:
> v <-c(4, 7, 23.5, 76.2, 80)
> x <-sqrt(v)
> x
[1] 2.0000002.645751 4.847680 8.729261 8.944272
向量化函数输出一个与输入向量相同长度的结果向量。
R语言支持向量的算术运算:
> v1 <-c(4, 6, 87)
> v2 <-c(34, 32.4, 12)
> v1 + v2
[1] 38.0 38.499.0
如果两个向量的长度不同,则使用循环规则:该规则重复较短的元素,直到得到的长度与较长向量的长度相同,如:
> v1 <-c(4, 6, 8, 24)
> v2 <-c(10, 2)
> v1 + v2
[1] 14 8 18 26
如果较长向量的长度不是较短向量长度的整数倍,则R给出警告:
> v1 <-c(4, 6, 8, 24)
> v2 <-c(10, 2, 4)
> v1 + v2
[1] 14 8 12 34
Warningmessage:
In v1 + v2 : 长的对象长度不是短的对象长度的整倍数
单个数字在R中表示为长度为1的向量,如:
> v1 <-c(4, 6, 8, 24)
> 2 * v1
[1] 8 12 16 48
数字2实际上是c(2)被循环,使得v1的所有元素都乘以2。
注意:循环规则同样适用于数组和矩阵。
|
|