R語言基礎--數(shù)據(jù)類型之向量
常見數(shù)據(jù)類型
R擁有許多用于存儲數(shù)據(jù)的對象(object)類型,包括標量(scalar)、向量(vector)、矩陣(matrix)、數(shù)組(array)、數(shù)據(jù)框(data frame)和列表(list)。它們在存儲數(shù)據(jù)的類型、創(chuàng)建方式、結構復雜度,以及用于定位和訪問其中個別元素的標記等方面均有所不同。下圖給出了這些數(shù)據(jù)結構的一個示意圖:
R的數(shù)據(jù)類型(模式)包括數(shù)值型、字符型、邏輯型(TRUE/FALSE)、復數(shù)型(虛數(shù))和原生型(字節(jié)型)
因子(factor)是名義型變量或有序型變量
標量(scalar)只含有一個元素的向量
向量型(vector):存儲數(shù)值型、字符型或邏輯型數(shù)據(jù)的一維數(shù)據(jù)。包括:邏輯型、整型、數(shù)值型、復數(shù)型和字符型。
矩陣,是二維數(shù)組,只是每個元素都擁有相同的模式(數(shù)值型、字符型或邏輯型)。
數(shù)組與矩陣類似,維度可以大于2
數(shù)據(jù)框由包含不同內容列構成數(shù)據(jù)集
列表一些對相或者成分的有序集合
1、查看數(shù)據(jù)類型
class()
使用class函數(shù)可以查看數(shù)據(jù)的類型,如下所示:
x=c(1,2,3,4)
class(x) #class函數(shù)查看數(shù)據(jù)的類型
[1] "numeric" #數(shù)字型
x1<-as.character(x) #字符型
class(x1)
[1] "character"
2、數(shù)據(jù)類型轉換
常用函數(shù)如下所示:
判斷轉換 類型轉換函數(shù)
is.numeric() as.numeric() #數(shù)字
#?is.numeric() as.numeric()
is.character() as.character()#字符
is.vector() as.vector() #向量
is.matrix() as.matrix() #矩陣
is.data.frame() as.data.frame() #數(shù)據(jù)框
is.factor() as.factor() #因子
is.logical() as.logical()#邏輯數(shù)據(jù)
#以上每一行的兩個函數(shù)都是定義相同類型的函數(shù)
使用如下所示:
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) #邏輯型數(shù)據(jù)轉化為0與1
[1] 0
as.numeric(TRUE)
[1] 1
3、向量
3.1常見向量類型
向量可以是數(shù)值,字符,邏輯等,如下所示:
a<-c(1,2,3,4,5,-3,-4);
a #數(shù)值型向量
[1] 1 2 3 4 5 -3 -4
b<-c("one","two","three");
b #字符型向量
[1] "one" "two" "three"
c<-c(TRUE,TRUE,TRUE,FALSE);c #邏輯型向量
[1] TRUE TRUE TRUE FALSE
x<-c(5,4,2);x
[1] 5 4 2
x[9]<-9;x # 當向量x不夠長時,指定第9個元素為9,#自動將中間的元素補為NA
[1] 5 4 2 NA NA NA NA NA 9
3.2向量的下標
向量的元素下標取值是以1開始,例如:要前例中取x向量中值為1,則為x[2],如果一個向量中有一個字符,則該向量的類型會變成字符,如下所示:
demo_1<-c(1,2,'a')
demo_1
# [1] "1" "2" "a"
mode(demo_1)
[1] "character"
3.3向量的名稱
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
3.4 向量元素的添加及合并
常用函數(shù)為
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=3) #在第3個向量后面加入10
## [1] 1 2 3 10
如果邏輯變量與數(shù)值在一起,則為轉換成數(shù)值。TRUE轉變成1 and FALSE 轉變成 0,如下所示:
demo_2<-c(1,2,TRUE);
demo_2
#[1] 1 2 1
mode(demo_2)
#[1] "numeric"
在R語言中沒有單一的整數(shù)、單一字符的概念,例如:
X<-2;X<-'a';R都是當作向量來處理,只是這個向量只包括單一值。
3.5 向量批量序列的生成
### seq()
用法:seq(length=, from=, to=)
length:指定生成個數(shù);from:是指開始生成的點;to:截止點。如果不指定,則默認條件下:seq(N1,N2,BY=),其中,n1:開始位置;n2:截止位置;by=指定間隔,如下所示:
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 結尾的序列數(shù)據(jù)
## [1] 1 2 1 2 3
### rep()
用法:1. rep(P,N) 重復生成P值N次;2.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,每個元素重復二次,整個數(shù)列重復兩次
## [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
3.6向量索引
取某個元素:x[2];(如果X包括名稱,注意:x[2]與x[[2]]的區(qū)別;
取某中幾個: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
3.7向量排序
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
3.8 向量運算
相加
Demo_5 <- 1:3;
Demo_5
#[1] 1 2 3
Demo_6 <- 2:5;
Demo_6
#[1] 2 3 4 5
Demo_7 <- Demo_6+ Demo_5;
Demo_7
Warning message:
In Demo_6 + Demo_5 :
longer object length is not a multiple of shorter object length
#[1] 3 5 7 6
3.9 向量:提取滿足某一條件的向量
常見用法如下所示:
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] 區(qū)間(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的元素變?yōu)?5
## [1] 10 9 8 7 6 5 4 25 2 1
x[x=1]<-12;
x #將x的第1個元素數(shù)值變?yōu)?2
## [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 ,實現(xiàn)了我們想要的效果,具體是如何實現(xiàn)的呢?
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
data > 20 是一個表示式,它的返回值是一個有TRUE和FALSE 構成的邏輯向量,最終只選取了TRUE對應的元素,所以data 中大于20的元素被選了出來。通過下標和邏輯值兩種方式,可以滿足我們絕大部分的需求,但是有時候,我們只是想知道符合條件的值對應的下標,這個時候which 函數(shù)就派上了用場,如下所示:
which(letters == "a")
#[1] 1
==操作符用來判斷字符串相等,which 函數(shù)返回對應的下標,letters 這個向量中,第一個元素就是字母a, 所以返回值為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
%in%操作符用來判斷操作符左邊的向量中的元素是否位于操作符右邊的向量中,通過這種集合操作,可以方便的一次返回多個下標,使用subset函數(shù)也可以提取滿足某一條件的向量元素,如下所示:
x <- c(1,3,8,2,20)
x
#[1] 1 3 8 2 20
subset(x,x>5)
#[1] 8 20
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%的聯(lián)合使用,如下所示:
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(tǒng)==z的值, 輸出為NA。
ifelse(y %in% z, 1, 0 )
#[1] 0 1 0 1
3.10 向量的比較
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) #比較數(shù)值型變量是否“近似相等”
## [1] TRUE
3.11 兩組數(shù)據(jù)的集合運算
> #首先對集合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中出現(xiàn)過,然后返回是或者否即可。而match(C,B)的結果就很不一樣了,它的返回結果同樣與前面的向量等長,但是它并非返回邏輯向量,而是遍歷了C里面的一個個元素,判斷它們是否在B中出現(xiàn)過,如果出現(xiàn)就返回在B中的索引號,如果沒有出現(xiàn),就返回NA。
