R语言的变量非常神奇,比较java、python来说
A容器没有标签,可以装任何类型的值------------------R
B容器一开始就有标签,只能装定义类型的值---------java
C容器用了一次就有了标签,只能装一种类型的值—python
这里的标签指的就是变量中’值的类型’
有时候R语言可以做到一个变量通吃一整段的代码,当然,我们并不推荐这么做;如果你突然回过头想找之前用过的值,结果你根本分不清哪个是哪个 --_–``,岂不是很难受,还要重新运行一遍前面的代码,所以说不管是从一个代码规范的角度,还是为了使用的方便,本人希望读者们可以有一个好的写代码的习惯,那就让我们从变量开始。
那么,什么是变量呢?正如前面例子中说的那样,变量是一个容器,它在内存中,并拥有自己独立的空间,用来存储数据(值、对象)。
1、由字母,数字,点(.
)和下划线(_
)组成,不允许有其他字符(例如:%,$,#...
)
2、不能以数字,下划线(_
)开头
3、以点(.
)开头,点后不能直接跟数字(错误案例:.2var_name
),为隐藏变量
4、能够见名知意(例如:hotel_price,hotel.price,hotelPrice
)
5、R语言严格要求区分大小写
(不论是函数,还是变量)
<-、<<-:左赋值
= :左赋值
->、->>:右赋值
其中 ‘=’ 是我们熟知的赋值运算符,另外的两个赋值符号,我们可以看作一个小箭头,指向哪里就是给哪里赋值,非常的简单粗暴。
简单案例:给变量x赋值,12
> x <- 12
> x = 12
> 12 -> x
print():比较常用的输出函数,自动换行
cat():可以将多个变量组合成一个连续的打印输出,不自动换行,可以在最后接一个" , '\n' "
简单案例:输出hello world!
> print('hello world!')
[1] "hello world!"
> print(paste('hello','world!')) #paste是一个字符串连接函数,中间以空格连接,不要空格可用paste0函数
[1] "hello world!"
> cat('hello','world!')
hello world!
ls()函数:
> ls() #查找所有变量,不包括隐藏变量
[1] "df" "max" "num" "percentage" "x" "y"
> ls(pattern = 'm') #查找所有变量名带有m的变量
[1] "max" "num"
> ls(pattern = '\\w{3}') #可以使用正则表达式
[1] "max" "num" "percentage"
> ls(all.names = TRUE) #查找所有变量,包括隐藏变量(以点开头)
[1] ".Random.seed" "df" "max" "num" "percentage" "x"
[7] "y"
rm()函数:
> rm('x') #删除名为‘x’的变量
> ls()
[1] "df" "max" "num" "percentage" "y"
当我们不再需要这个变量的时候,就可以使用rm()函数无情抛弃它了:),当然,我不是在引导你们成为’渣男/女’,只是因为大量变量会占用内存,从而降低程序的运行速度,所以不得不“磨刀霍霍”了。
我们还可以将rm()和ls()结合起来用,提升删除效率。
> rm(list = ls(pattern = 'm')) #删除变量名带‘m’的变量
> ls()
[1] "df" "percentage" "y"
> rm(list = ls()) #删除所有变量
> ls()
character(0)
[ 可能我的案例中,大家看不出什么方便的地方,这是我的命名方式问题,我检讨 ]
大家不妨想一下,如果说(打个比方),前面的变量是分类的(都是以hotel_
开头的变量名),在删除的时候是否会便利许多呢。
R语言有这样一些较常用的R对象:向量、列表(list)、矩阵(matrix)、数组(array)、因子(factory)、数据框(data.frame)
最为简单的当属向量,其建立在以下6种基本类型(也叫原子向量
)之上:
数据类型 | 实例 | 代码与结果 |
---|---|---|
逻辑型(布尔值) | TRUE,FALSE | > class(TRUE) - [1] "logical" |
数值型 | 23.2, 5, 99.99 | > class(12.5) - [1] "numeric" |
整数型 | 2L, 45L | > class(45L) - [1] "integer" |
复数型 | 4+3i | > class(4+3i) - [1] "complex" |
字符型 | '1', 'hello', "world" |
> class('hello') - [1] "character" |
序列化字符(原生) | "hello" 存储为:48 65 6c 6c 6f |
> class(charToRaw('hello')) - [1] "raw" |
切记,里面没有string类型,所有字符(串)都是character。
要创建多个元素的向量,我们需要用到c()函数,它可以对多个元素进行组合。
> demo01 <- c('hello',"world",'!')
> demo01 #直接查看demo01的值(在控制台可以不使用print()或cat())
[1] "hello" "world" "!"
> class(demo01)
[1] "character"
当不同类型的元素组合在一起时,就会发生非常有趣的变化
#1、logical和raw的组合
> demo01 <- c(TRUE,charToRaw('hello'))
> demo01
[1] TRUE TRUE TRUE TRUE TRUE TRUE
#非0的数值变为logical都是TRUE,0为FALSE
> class(demo01)
[1] "logical"
#2、logical和integer的组合
> demo01 <- c(TRUE,12L)
> demo01
[1] 1 12
#TRUE转为数值为1,FALSE为0
> class(demo01)
[1] "integer"
#3、integer和numeric的组合
> demo01 <- c(12L,13.5)
> demo01
[1] 12.0 13.5
> class(demo01)
[1] "numeric"
#4、numeric和complex的组合
> demo01 <- c(13.5, 3+2i)
> demo01
[1] 13.5+0i 3.0+2i
> class(demo01)
[1] "complex"
#5、complex和character的组合
> demo01 <- c(3+2i,'hello')
> demo01
[1] "3+2i" "hello"
> class(demo01)
[1] "character"
c()函数能将多个元素组合成一个向量,但一个向量只能是一个类型,从上面的实践来看,存在类型间的自动转换,依次为:raw->logical->integer->numeric->complex->character
,既然有自动转换,那么也少不了强制转换了,charToRaw()已经见过面了,其余的还有:as.numeric(),as.complex(),as.character(),as.logical(),as.integer(), rawToChar(),toString()。。。等。
列表这个R对象,可以包含许多不同类型的元素,向量、函数、也可以是另一个列表。
#定义一个列表
> list1 <- list(c('as','R'),'hello',mean, list('you','be'))
> list1
[[1]]
[1] "as" "R"
[[2]]
[1] "hello"
[[3]]
function (x, ...)
UseMethod("mean")
[[4]]
[[4]][[1]]
[1] "you"
[[4]][[2]]
[1] "be"
#取出list1的第一个元素
> list1[[1]]
[1] "as" "R"
切记:R语言的下标是从1开始计数的
矩阵可以理解为一个二维数组,通过向量的形式输入
#定义一个矩阵
> x<-matrix(c(1,2,3,4,5,6),nrow = 2,ncol = 3)
> x
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
#byrow参数默认为F(FALSE),可以设置成TRUE,改变元素排列
> x<-matrix(c(1,2,3,4,5,6),nrow = 2,ncol = 3,byrow = T)
> x
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> y<-t(x) #t()函数是矩阵的转置
> y
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> 2*x #数值*矩阵,相当于数值*矩阵内每个元素
[,1] [,2] [,3]
[1,] 2 4 6
[2,] 8 10 12
> x%*%y #矩阵相乘符号%*%
[,1] [,2]
[1,] 14 32
[2,] 32 77
#我们还可以通过dim()函数来获取矩阵的每个维度
> dim(x)
[1] 2 3
#也可以用来改变其维度
> dim(x) <- c(1,6)
> x
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 3 4 5 6
数组的维度数是任意的,在创建的时候,由dim这一属性控制
#创建数组
> x<-array(c(1,2,3,4,5,6,7,8,9,10,11,12),dim = c(2,3,2))
> x
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
#取值
> x[1,1,1]
[1] 1
> x[1,2,2]
[1] 9
因子是一种向量形式的R对象。因子将向量中的元素的不同值作为标签,标签始终是字符,无论它原来是数字、字符还是逻辑(布尔)等,它在统计建模时非常有用。
#将上述数组x,转为factor(因子),并查看
> x<-factor(x)
> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12
Levels: 1 2 3 4 5 6 7 8 9 10 11 12
#转为factor后,会将原来的结构打散,重新变为向量的形式,只是形式
#级别统计
> nlevels(x)
[1] 12
数据框是表格类型的R对象。与矩阵不同之处在于:矩阵的类型是唯一的,元素只能是同一种类型;数据框则是列与列的类型可以不同。数据框的每一列都可以作为一个组合向量,且长度相同。
使用data.frame()函数创建。
> df<-data.frame(id = c(1, 2, 3, 4, 5), color = c('red', 'yellow', 'green', 'red', 'green'))
> df
id color
1 1 red
2 2 yellow
3 3 green
4 4 red
5 5 green
#取值
> df[1,2]
[1] red
Levels: green red yellow
> df[1,'color']
[1] red
Levels: green red yellow
这些类型都是在R语言中相当常用的,具体的使用,以及其他的方法,我会再单独补充,若其中有什么错误或是遗漏,欢迎指出,谢谢品鉴!!