首先需要说明的是,在R语言中向量和列表是不一样的,向量中每一个元素的类型都是一样的,而列表反之,这里的列表与Python中的列表有几分相似。以下是分类情况:
同样类型的数据 | 不同类型的数据 | |
---|---|---|
一维 | 向量(vector) | 列表(lists) |
二维 | 矩阵(matrics) | 数据框(dataframe) |
N维 | 数组(array) |
R语言中生成常用向量主要有这么几个方法:
c
函数我们知道,向量里面的元素应该要是同类型的,那么,如果在生成的时候我们没有用同类型数据会怎么样呢?举个例子:
######## 第一种情况
x <- c('abc',123)
x
# 输出
"abc" "123"
####### 第二种情况
x <- c(123,False)
x
# 输出
123 0
####### 第三种情况
x <- c("abc", 123, False)
x
# 输出
"abc" "123" "False"
观察以上代码,结合字符型、数值型、逻辑型的存储空间大小最大者为字符型,我们可以得到结论:当数据类型不同时,会将数据向需要存储空间多的类型转变,这就好比胖子可以穿瘦子的衣服,而反之不可。
:
符号生成向量这种方法比较简单,不过多解释,见例子:
######
x <- 1:3
x
# 结果
1 2 3
######
x <- 3:1
# 结果
3 2 1
这种方法生成的向量是等1
步长的,那么如果要生成不等步长该怎么做呢?可以使用以下的方法
seq()
函数# 使用方法
seq(from, to, by=) 或 seq(from, to, length=)
其中:
from表示序列的开始值
to表示序列的终止值
by表示步长,如果没有设定,默认值是by=1
length指的是序列的总长度,也可以写成length.out
# 例子1
seq(1,10,by=2)
[1]1 3 5 7 9
# 例子2
seq(1,10,length=5)
[1]1.00 3.25 5.50 7.75 10.00
rep()
函数这个函数对应的英语单词为:repetition, n.重复
# 使用方法
rep(data,times,each=)
其中:
data表示需要重复的元素
times表示重复次数,是data整体重复几遍
each表示每个元素重复的次数,是单个元素重复几遍
# 例子1
rep(1:2,3)
[1]1 2 1 2 1 2
# 例子2
rep(1:2,each=3)
[1]1 1 1 2 2 2
paste
函数# 使用方法
paste(A,B,sep="")
作用:将A字符串和B字符串连接成新字符串,也可以将两个以上的字符串连接sep的默认值是一个空格
# 例子
paste("jinrong","1401","sep"="")
[1]"jinrong1401"
paste("jinrong","1401")
[1]"jinrong 1401"
sample
函数——随机整数# 使用方法
sample(x,size,replace=False,prob=NULL)
作用:产生size个随机整数,数据范围为x
# 例子
x <- sample(1:100,3) # 在1到100里面随机生成3个整数
[1]64 57 26
runif
函数——均匀分布(Uniform)使用方法:
runif(size,min=,max=)
作用:生成min到max之间的size个服从均匀分布的随机数
例子:
x <- runif(3,0,1)
[1]0.63412778 0.88305513 0.82242222
rnorm
函数——正态分布(Normal)使用方法:rnorm(size,mean=,std=)
作用:生成size个服从N(mean,std)的随机数
rpois
函数——泊松分布(Poisson)使用方法:rpois(size,lamda)
作用:生成参数为lamda的size各服从泊松分布的随机数
rfunc()
函数——自制函数使用方法:rfunc(size,p1,p2,...)
作用:func为概率分布函数,size为生成随机数的个数,p1,p2,…为需要的参数
x <- c(x=3, y=4, z=5)
# 输出
x y z
3 4 5
这种方法相当于设置了一种映射,可以用于批量命名变量,非常好用,在这里就不多说了
如果我们要给变量改名怎么办呢?可以考虑使用names()
函数
names()
函数# 使用方法:
names(x) <- value
# 例子
names(x)[2] <- "U"
# 输出
x U z
3 4 5
问题:如何使用上文提到的方法生成如下向量
“金融1701甲” “金融1701乙” “金融1702甲” “金融1702乙”
“金融1703甲” “金融1703乙” “金融1704甲” “金融1704乙”
# 参考代码1:
a <- "金融"
b <- 1701:1704
c <- c("甲","乙")
bc = rep(0,length(b)*length(c))
i = 1
for (year in b){
bc[i] = paste(a,paste(year,"甲",sep=""),sep="")
bc[i+1] = paste(a,paste(year,"乙",sep=""),sep="")
i = i+2
}
# 参考代码2:
x <- paste("金融",rep(1701:1704,each=2),c("甲","乙"),sep="")
# 输出
[1] "金融1701甲" "金融1701乙" "金融1702甲" "金融1702乙"
[5] "金融1703甲" "金融1703乙" "金融1704甲" "金融1704乙"