20200505·Kony·Win10
变量(various):用于存储值保留的内存位置,变量被分配了R对象,并且R对象的数据类型成为变量的数据类型。
R对象类型(Types of R-objects):
- 向量(vectors):存储数值型、字符型或逻辑型数据的一维数据
- 列表(lists):一些对相或者成分的有序集合
- 矩阵(matrices):二维数组,只是每个元素都拥有相同的模式(数值
型、字符型或逻辑型) - 数组(arrays):与矩阵类似,维度可以大于2
- 因子(factors):名义型变量或有序型变量
-
数据框(Data Frames):由包含不同内容列构成数据集
向量(vector object)
一、向量的数据类型:
- 逻辑(logical):TRUE、FALSE
- 数值型(numeric)
- 整型(integer):1L、0L
- 复数型//虚数(complex):3+2i
- 字符型(character):“Hello”
- 原生型 (raw):
1.1 数据类型的优先权
1.2 创建具有多个元素的向量:c()函数
# 创建多个元素的向量a
a<-c("red","blue","yellow")
a#When we execute the above code, it produces the following result −
[1] "red" "green" "yellow"
1. 3 查看数据类型:class()**
x=c(1,2,3,4)
class(a)#When we execute the above code, it produces the following result −
[1] "numeric"
转换数据类型
判断转换 类型转换函数
is.numeric() as.numeric() #数字
is.character() as.character()#字符
is.vector() as.vector() #向量
is.matrix() as.matrix() #矩阵
is.data.frame() as.data.frame() #数据框
is.factor() as.factor() #因子
is.logical() as.logical()#逻辑数据
以上每一行的两个函数都是定义相同类型的函数
a <- c(1,2,3);
a
[1] 1 2 3
is.numeric(a)
[1] TRUE
is.vector(a)
[1] TRUE
a <- as.character(a) #将a转化为字符串类型
a
[1] "1" "2" "3"
is.numeric(a)
[1] FALSE
is.data.frame(a)
[1] FALSE
is.vector(a)
[1] TRUE
is.character(a)
[1] TRUE
as.numeric(FALSE) #逻辑型数据转化为0与1
[1] 0
as.numeric(TRUE)
[1] 1
?不是很懂raw
二、向量应用
向量 的下标是从1开始的
2.1 给向量命名
years <- c(1960,1964,1976,1994)
years
[1] 1960 1964 1976 1994
names(years)<-c("Kennedy", "Johnson", "Carter","Clinton");
years
Kennedy Johnson Carter Clinton
1960 1964 1976 1994
2.2 向量元素的添加及合并
常用函数为c(),append(),如下所示:
v1<-c(1,2,3); # 向量元素的添加
v1
## [1] 1 2 3
v2<-c(v1,55);
v2
## [1] 1 2 3 55
c(v2,v1) # 向量的合并
## [1] 1 2 3 55 1 2 3
append(v1,10,after=2) #在第2个向量后面加入10
## [1] 1 2 10 3
2.3 向量批量序列的生成
- a<-c(1:10)
- seq()
seq(length=, from=, to=)
length:指定生成个数;from:是指开始生成的点;to:截止点
如果不指定,则默认条件下:seq(N1,N2,BY=),其中,n1:开始位置;n2:截止位置;by=指定间隔
v=c(1:10)
v
## [1] 1 2 3 4 5 6 7 8 9 10
seq(length=10,from=10,to=100) # 生成从10到100的向量,一共10个
## [1] 10 20 30 40 50 60 70 80 90 100
# 此命令等价于:
seq(10,100,10)
## [1] 10 20 30 40 50 60 70 80 90 100
seq(1,10,by=2)
## [1] 1 3 5 7 9
seq(1,10,length=6)
## [1] 1.0 2.8 4.6 6.4 8.2 10.0
sequence(2:3) #产生以 2 和 3 结尾的序列数据
## [1] 1 2 1 2 3
rep()
- rep(P,N) 重复生成P值N次;
- rep(a1:a2,a1:a2) #重复a1到a2,按a1产生a1次,按a2产生a2次,如下所示:
rep(1,10)
## [1] 1 1 1 1 1 1 1 1 1 1
rep(1:5,each=2, times=2) #重复1到5,每个元素重复二次,整个数列重复两次
## [1] 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5
rep(1:3,1:3) # 1重复1次,2重复2次,3重复3次
## [1] 1 2 2 3 3 3
2.4 向量索引
取某个元素:x[2];(如果X包括名称,注意:x[2]与x[[2]]的区别;
取某中几个:x[c(1,2,0)]
取某个/几个元素,利用-:x[-n]#取除去第n个元素之外的其他元素
years <- c(1960,1964,1976,1994)
years
[1] 1960 1964 1976 1994
names(years)<-c("Kennedy", "Johnson", "Carter","Clinton");
years
Kennedy Johnson Carter Clinton
1960 1964 1976 1994
x<-years
x[2]
Johnson
1964
x[[2]]
[1] 1964
2.5 向量排序
sort(); 输出排序后的结果;order();输出排序后的各个向量位置,如下所示:
a<-c(3,9,0,12,19)
sort(a)
## [1] 0 3 9 12 19
order(a)
## [1] 3 1 2 4 5
2.6 向量:提取满足某一条件的向量
x[n] 第n个元素
x[-n] 除了第n个元素的x
x[1:n] 前n个元素
x[-(1:n)] 第n+1至最后的元素
x[c(1,4,2) ] 指定元素
x["name"] 名为"name"的元素
x[x > 3] 所有大于3的元素
x[x > 3 & x < 5] 区间(3,5)的元素
x[x %in% c ("a","and","the")] 给定组中的元素
x<-c(10:1);
x
## [1] 10 9 8 7 6 5 4 3 2 1
x[x==3]<-25;
x #将x中等于3的元素变为25
## [1] 10 9 8 7 6 5 4 25 2 1
x[x=1]<-12;
x #将x的第1个元素数值变为12
## [1] 12 9 8 7 6 5 4 25 2 1
letters[1:30] # 产生字母序列
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z" NA NA NA NA
a <- c(2,3,4,2,5,1,6,3,2,5,8,5,7,3);
a
## [1] 2 3 4 2 5 1 6 3 2 5 8 5 7 3
which.max(a) # 找出最大元素的下标
## [1] 11
which.min(a) # 找出最小的元素下标
## [1] 6
a[which.max(a)] # 找出最大的元素
## [1] 8
which(a==2) # 等于2的元素的下标
## [1] 1 4 9
a[which(a==2)] # 等于2的元素
## [1] 2 2 2
which(a>5) # 大于5的元素的下标
# [1] 7 11 13
a[which(a>5)] # 大于5的元素
## [1] 6 8 7
data <- 1:100
data[data > 20] # 取data 中大于20 的对象出来
# [1] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
[25] 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
[49] 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
[73] 93 94 95 96 97 98 99 100
data > 20 是一个表示式,它的返回值是一个有TRUE和FALSE 构成的逻辑向量,最终只选取了TRUE对应的元素,所以data 中大于20的元素被选了出来。
data > 20
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[17] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[33] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[49] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[65] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[81] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[97] TRUE TRUE TRUE TRUE
- ==操作符用来判断字符串相等,which 函数返回对应的下标,letters 这个向量中,第一个元素就是字母a, 所以返回值为1
- %in%操作符用来判断操作符左边的向量中的元素是否位于操作符右边的向量中,通过这种集合操作,可以方便的一次返回多个下标,使用subset函数也可以提取满足某一条件的向量元素,如下所示:
which(letters == "a")
#[1] 1
letters
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x"
#[25] "y" "z"
which(letters %in% c("a", "d", "e"))
#[1] 1 4 5
2.7 ifelse
x <- c(1,1,1,0,0,1,1);
x #[1] 1 1 1 0 0 1 1
ifelse(x != 1, 1, 0) #若果x的值不等于1,输出1,否则输出0 #[1] 0 0 0 1 1 0 0
ifelse和%in%的联合使用,如下所示:
ifelse(x %in% 1, 1, 0) #若x的值包含在1里面,输出1,否者输出0
#[1] 1 1 1 0 0 1 1
ifelse(x %in% 1, 'yes', 'no') #若x的值包含在1里面,输出yes,否者输出no
#[1] "yes" "yes" "yes" "no" "no" "yes" "yes"
which(x %in% 1) # 输出x包含在1中值的位置
#[1] 1 2 3 6 7
y <- c(2, 1, 3, 4)
z <- c(1, 4)
ifelse(y %in% z, which(y==z), 0 ) ##若y的值包含在z里面,输出y==z的位置,否者输出0
#[1] 0 4 0 4
ifelse(y %in% z, which(y==z), 0 ) ##若y的值包含在z里面,输出y==z的位置,否者输出0,
#[1] 0 4 0 4
> #此例中没有找到y==z的值, 输出为NA。
ifelse(y %in% z, 1, 0 )
#[1] 0 1 0 1
2.8 向量的比较
x<-c(1,2,3)
y<-c(1,2,3)
z<-c(1,2,4);
x;y;z
## [1] 1 2 3
## [1] 1 2 3
## [1] 1 2 4
x==y;x==z;y==z #分别比较x,y,z的各个元素
## [1] TRUE TRUE TRUE
## [1] TRUETRUE FALSE
## [1] TRUETRUE FALSE
identical(x,y);identical(x,z);identical(z,y) #比较x,y,z的整体
## [1] TRUE
## [1] FALSE
## [1] FALSE
all.equal(x,y) #比较数值型变量是否“近似相等”
## [1] TRUE
2.9 两组数据的集合运算
> #首先对集合A,B,C赋值
A<-1:10
B<-seq(5,15,2)
C<-1:5
union(A,B)#求A和B的并集
#[1] 1 2 3 4 5 6 7 8 9 10 11 13 15
intersect(A,B) #求A和B的交集
#[1] 5 7 9
setdiff(A,B) #求A-B
#[1] 1 2 3 4 6 8 10
setdiff(B,A) #求B-A
#[1] 11 13 15
setequal(A,B) # 检验集合A,B是否相同
#[1] FALSE
is.element(12,C) #检验元素12是否属于集合C
#[1] FALSE
all(C%in%A) #检验集合A是否包含C
#[1] TRUE
all(C%in%B)
#[1] FALSE
match(C,B)
#[1] NA NA NA NA 1
%in%这个操作符只返回逻辑向量TRUE 或者FALSE,而且返回值应该与%in%这个操作符前面的向量程度相等。也就是说它相当于遍历了C里面的一个个元素,判断它们是否在B中出现过,然后返回是或者否即可。
而match(C,B)的结果就很不一样了,它的返回结果同样与前面的向量等长,但是它并非返回逻辑向量,而是遍历了C里面的一个个元素,判断它们是否在B中出现过,如果出现就返回在B中的索引号,如果没有出现,就返回NA。
笔记参考:R语言基础--数据类型之向量https://www.jianshu.com/p/7b47a6bbb7a9