1. 程式人生 > >R語言(一)

R語言(一)

統計 也有 cto 顯示 名稱 註意 pch col 獲得

向量運算

R的強大功能之一就是把整個數據向量作為一個單一對象來處理。一個數據向量僅是數字的排列,一個向量可以通過如下方式構造

weight<-c(2,34,434,53)
weight
[1]   2  34 434  53

結構c(……)用來構造向量。這既不是R中輸入向量的唯一方法,也不是一般首選的方法。

如果要對上述變量做數學運算,則是逐個元素的方式進行。

作圖

plot(height,weight,pch=2)

關鍵字pch(繪圖符號)改變繪圖符號

函數lines將通過一條直線將(x,y)值增加到現有的圖中

生成向量的函數

這裏介紹3個函數:c、seq和rep,用於不同情形下向量的創建。

第一個函數c,它是“concatenate”(連接)的簡寫,含義是把各分項首尾連接

另外也有可能給某些元素命名。這改變了變量輸出的方式,這樣做通常是出於顯示的目的。

> x<-c(red="Huey",blue="Dewey",green="Louie")
> x
    red    blue   green 
 "Huey" "Dewey" "Louie"

名稱可以被提取或使用names設置

> names(x)
[1] "red"   "blue"  "green"


一個向量的所有元素類型都相同。如果你連接不同類型的向量,它們將被轉化為最少“限制”的類型:

> c(FALSE,3)
[1] 0 3
> c(pi,"abc")
[1] "3.14159265358979
" "abc" > c(FALSE,"abc") [1] "FALSE" "abc"


也就是說,邏輯值被轉換為0/1或“False”/”True”,數字轉換為它們的輸出形式的字符串。

第二個函數seq(“sequence”),用來建立數字等差序列,如

> seq(4,9)
[1] 4 5 6 7 8 9


如果希望間距是2,

> seq(4,10,2)
[1]  4  6  8 10

第三個函數rep(“replicate”),用來產生重復值。使用時有兩個參數,依賴於第二個參數是一個向量還是一個數字,產生的結果會有不同

> oops<-c(7,9,13)
> rep(oops,3
) [1] 7 9 13 7 9 13 7 9 13 > rep(oops,1:3) [1] 7 9 9 13 13 13


第一個rep哈桑農戶對整個向量oops重復三次。第二次調用用一個有3個值(1,2,3)的向量代替數字3;這些值相應於oops向量的每一個元素,意味著7重復1次,9重復2次,13重復3次。

矩陣和數組

矩陣就是一個二維數值數組。

> x<-1:12
> dim(x)<-c(3,4)
> x
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

創建矩陣的一個方便的方法是使用matrix函數:

matrix(1:12,nrow=3,byrow=T)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12


請註意,這裏byrow=T將矩陣改變成以按行而不是按列形式填充。

對矩陣進行操作的有用函數包括rownames、colnames、轉置函數t

> x<-matrix(1:12,nrow=3,byrow=T)
> rownames(x)<-LETTERS[1:3]
> x
  [,1] [,2] [,3] [,4]
A    1    2    3    4
B    5    6    7    8
C    9   10   11   12
> t(x)
     A B  C
[1,] 1 5  9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12


特征i向量LETTERS是一個包含大寫字母A——Z的內置變量。其他有用的相似變量是分別表示小寫字母、月份名稱、月份名稱縮寫的letters、month.name和month.abb


可以按行或者按列分別使用cbind和rbind函數將向量“粘”到一起。

> cbind(A=1:4,B=5:8,C=9:12)
     A B  C
[1,] 1 5  9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
> rbind(A=1:4,B=5:8,C=9:12)
  [,1] [,2] [,3] [,4]
A    1    2    3    4
B    5    6    7    8
C    9   10   11   12


因子

分類變量在統計數據中是常見的,表明數據的某些細分屬性,如社會階層、主要診斷、腫瘤分期、青春期階段等。通常它們用數字代碼輸入。

在R中,這些變量被指定為因子。這種數據結構使得不同的分類類別被賦予有意義的名稱成為可能。

對R來說,區分類別編碼和取值有直接數字含義的變量是最基本的。

術語說一個因子有一系列水平——比方說4個水平。一個四水平因子包含兩項含義:a)1到4之間整數的一個向量b)一個長度為4的包含字符串的特征向量

看一個例子:

> pain<-c(0,3,2,2,1)
> fpain<-factor(pain,levels=0:3)
> levels(fpain)<-c("none","mild","medium","severe")


第一個命令創建了一個數值向量pain,對5個病人的疼痛水平編碼。我們希望把他作為一個分類變量處理,所以我們通過它利用函數factor創建一個因子fpain。它的調用除了pain以外,還跟著另一個參數即levels=0:3,這意味著輸入的編碼使用了4個值0~3.後者在理論上可以省略,因為R默認使用pain中合理排序的值,但保留它是一個很好的習慣,如下所示。最後一行的作用是將水平名稱轉換為特定的4個字符串.

> fpain
[1] none   severe medium medium mild  
Levels: none mild medium severe
> as.numeric(fpain)
[1] 1 4 3 3 2
> levels(fpain)
[1] "none"   "mild"   "medium" "severe"


函數as.numeric提取數字編碼為1~4,levels提取水平的名稱。註意根據數字0~3的原始輸入編碼不顯示了,一個因子的內置表達方式始終是從1開始的數字。

列表

可以通過函數list創建一個列表。

> intake.pre<-c(5260,5470,5640,6180,6390,6515,6805,7515,7515,8230,8770)
> intake.post<-c(3910,4220,3885,5160,5645,4680,5265,5975,6790,6900,7335)
> mylist<-list(before=intake.pre,after=intake.post)
> mylist
$before
 [1] 5260 5470 5640 6180 6390 6515 6805 7515 7515 8230 8770

$after
 [1] 3910 4220 3885 5160 5645 4680 5265 5975 6790 6900 7335


列表各部分通過list中使用的參數名稱來命名。命名的部分可以如下提取:

mylist$before
 [1] 5260 5470 5640 6180 6390 6515 6805 7515 7515 8230 8770

數據框

數據框被稱為“數據矩陣”或“數據集”。它是一系列等長度的向量和/或因子,它們交叉相關,使得同一位置的數據來自同一試驗單元(對象、動物等)。除此之外,它具有唯一的一組行名稱。

> d<-data.frame(intake.pre,intake.post)
> d
   intake.pre intake.post
1        5260        3910
2        5470        4220
3        5640        3885
4        6180        5160
5        6390        5645
6        6515        4680
7        6805        5265
8        7515        5975
9        7515        6790
10       8230        6900
11       8770        7335


像list一樣,組分(單個變量)可以通過$符號獲得:

> d$intake.pre
 [1] 5260 5470 5640 6180 6390 6515 6805 7515 7515 8230 8770


索引

如果需要向量中一個具體的元素

>intake.pre[5]
[1] 6390

方括號用來選擇數據,也稱為索引或子集選擇

如果希望一個包含多於一個的數據的子向量,比如序號為3、5、7、可以用一個向量來索引:

> intake.pre[c(3,5,6)]
[1] 5640 6390 6515


R的一個巧妙功能是可以使用負索引。可以通過下式得到除了位置為3、5、7之外的所有其他元素

> intake.pre[-c(3,5,6)]
[1] 5260 5470 6180 6805 7515 7515 8230 8770


排序

對向量排序,只需使用sort函數即可

> sort(intake.post)
 [1] 3885 3910 4220 4680 5160 5265 5645 5975 6790 6900 7335


然而,僅對一個單一的向量排序並不總能滿足需求。經常需要根據某些其他變量的值對一系列變量排序——如果根據性別和年齡對血壓排序。為此目的,有一個結構看上去很抽象,但確實功能強大。首先計算一個變量的次序。

order(intake.post)
 [1]  3  1  2  6  4  7  5  8  9 10 11


結果是數字1至11(或者其他的向量長度),根據order參數(這裏是intake.post)的大小排序。對order結果的解釋優點棘手——應該是如下所述:通過將其值依次置於3、1、2、6等對intake.post排序。

o<-order(intake.post)
> intake$post[o]
 [1] 3885 3910 4220 4680 5160 5265 5645 5975 6790 6900 7335

R語言(一)