5 高級數據管理
數據分析 BY 倫大錘 閱讀量 1,948css
相對於基本數據管理,此處咱們將接觸到R中多種數學、統計和字符處理函數,學習如何本身編寫函數,包括循環和條件執行語句,以及瞭解數據的整合和概述方法、重塑和重構方法。git
5.1 一個數據處理難題
要討論數值和字符處理函數,不妨先考慮一個數據問題。一組學生參加了數學、科學和英語考試,須要按照某種成績衡量指標將三門科目的成績組合起來並排序,將前20%的學生評定爲A,接下來20%的學生評定爲B,依次類推。最後,將全部學生按照字母順序進行排序並輸出。正則表達式
須要考慮的問題包括如下幾點:api
- 三科的均值和標準差相去甚遠,所以求平均值顯然沒有意義。在組合多門成績以前,必須將其變換爲可比較的單元;
- 將三科成績組合以後,須要肯定一種標準來評定學生的排名;
- 表示姓名的字段只有一個,使得排序任務複雜化。爲了正確地將其排序,須要將姓和名拆開。
5.2 數值和字符處理函數
R中數據處理最爲重要的函數包括數值(數學、統計、機率)函數和字符處理函數。數組
數學函數
經常使用的數學函數包括:app
- abs(x):絕對值;
- sqrt(x):平方根;
- ceiling(x):不小於x的最小整數;
- floor(x):不大於x的最大整數;
- trunc(x):向0的方向截取x的整數部分;
- round(x, digits=n):將x舍入爲指定位的小數;
- signif(x,digits=n):將x舍入爲指定的有效數字位數;
- cos(x)、sin(x)、tan(x)、acos(x)、asin(x)、atan(x)、cosh(x)、sinh(x)、tanh(x)、acosh(x)、asinh(x)、atanh(x):三角函數;
- log(x,base=n):對x取以n爲底的對數;
- log(x):對x取以e爲底的對數;
- log10(x):對x取以10爲底的對數;
- exp(x):e的指數函數。
統計函數
經常使用的統計函數包括:ide
- mean(x):平均數;
- median():中位數;
- sd(x):標準差;
- var(x):方差;
- mad(x):絕對中位差;
- quantile(x,probs):求分位數,其中x爲待求分位數的數值型向量,probs爲一個由[0,1]之間的機率值組成的數值向量;
- range(x):求值域;
- sum(x):求和;
- diff(x,lag=n):滯後差分;
- min(x):求最小值;
- max(x):求最大值;
- scale(x,center=TRUE,scale=TRUE):爲數據對象x按列進行中心化或標準化。
其中許多函數都提供了豐富的可選參數,能夠進一步影響輸出結果。例如如下截尾平均數,丟棄了最大5%和最小5%的數據和全部缺失值後獲得算數平均值。函數
|
z
<
-
mean
(
x
,
trim
=
0.05
,
na
.
rm
=
TRUE
)
|
如下代碼演示了計算某個數值向量均值和標準差的兩種方式:工具
|
x
<
-
c
(
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
)
mean
(
x
)
sd
(
x
)
n
<
-
length
(
x
)
meanx
<
-
sum
(
x
)
/
n
css
<
-
sum
(
(
x
-
meanx
)
^
2
)
sdx
<
-
sqrt
(
css
/
(
n
-
1
)
)
|
不難發現,R中公式的寫法和相似Matlab的矩陣運算語言有着許多共同之處。性能
使用如下代碼對矩陣或數據框的數值列進行均值爲一、標準差爲0的標準化:
|
newdata
<
-
scale
(
mydata
)
|
或者任意均值和標準差:
|
newdata
<
-
scale
(
mydata
)
*
SD
+
M
|
若是僅對指定列處理,則使用transform()函數:
|
newdata
<
-
transform
(
mydata
,
myvar
=
scale
(
myvar
)
*
SD
+
M
)
|
機率函數
概覽函數和統計函數相似,可是一般用來生成特徵已知的模擬數據,以及在用戶編寫的統計函數中計算機率值。
R中的每一個概覽函數都對應四個具體函數:d(密度函數)、p(分佈函數)、q(分位數函數)和r(生成隨機數)。
![R經常使用機率函數](http://static.javashuo.com/static/loading.gif)
以正態分佈爲例,若是不指定均值和標準差,將會生成標準正態分佈(均值爲0,標準差爲1),相應的密度函數(dnorm)、分佈函數(pnorm)、分位數函數(qnorm)和隨機生成函數(rnorm)分別以下。
|
x
<
-
pretty
(
c
(
-
3
,
3
)
,
30
)
y
<
-
dnorm
(
x
)
plot
(
x
,
y
,
type
=
"l"
,
xlab
=
"NormalDeviate"
,
ylab
=
"Density"
,
yaxs
=
"i"
)
#位於x=1.96左側標準正態曲線下方的面積
pnorm
(
1.96
)
#均值爲500,標準差爲100正態分佈的0.9分位點的值
qnorm
(
.
9
,
mean
=
500
,
sd
=
100
)
#生成50個均值爲50,標準差爲10的正態隨機數
#rnorm(50,mean=50,sd=10)
|
在每次生成僞隨機數的時候,函數都會使用一個不一樣的種子,所以也會產生不一樣的結果。能夠經過函數set.seed()顯式指定種子,使得以前的結果能夠重現(reproducible)。重現數據有助於建立會在將來取用的,以及可與他人分享的隨機示例數據。
使用MASS包中的mvrnorm()函數能夠生成來自給定均值向量和協方差矩陣的多元正態分佈,如下是一個生成知足指定三元正態分佈的例子。
|
library
(
MASS
)
options
(
digits
=
3
)
set
.
seed
(
1234
)
mean
<
-
c
(
230.7
,
146.7
,
3.6
)
sigma
<
-
matrix
(
c
(
15360.8
,
6721.2
,
-
47.1
,
6721.2
,
4700.9
,
-
16.5
,
-
47.1
,
-
16.5
,
0.3
)
,
nrow
=
3
,
ncol
=
3
)
mydata
<
-
mvrnorm
(
500
,
mean
,
sigma
)
mydata
<
-
as
.
data
.
frame
(
mydata
)
names
(
c
(
"y"
,
"x1"
,
"x2"
)
)
dim
(
mydata
)
head
(
mydata
,
n
=
10
)
|
字符處理函數
數學和統計函數用於處理數值型數據,而字符處理函數用於從文本型數據中抽取信息。
- nchar(x):計算x中的字符數量;
- substr(x, start, stop):提取或替換子串;
- grep(pattern, x, ignore.case=FALSE, fixed=FALSE):在x中搜索某種模式,fixed=FALSE則pattern爲一個正則表達式,不然pattern爲一個文本字符串,返回值爲匹配的下標;
- sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE):在x中搜索某種模式並替換;
- strsplit(x, split, fixed=FALSE):在split處分隔字符向量x中的元素;
- paste(…, sep=」」):鏈接字符串,分隔符爲sep。paste(「x」, 1:3, sep=」」)返回值爲c(「x1」, 「x2」, 「x3」),paste(「x」, 1:3, sep=」M」)返回值爲c(「xM1」, 「xM2」, 「xM3」);
- toupper(x):大寫轉換;
- tolower():小寫轉換。
其餘實用函數
- length(x):x的長度;
- seq(from, to, by):生成一個序列,by爲步長;
- rep(x, n):將x重複n次;
- cut(x ,n):將連續型變量x分割爲n個水平的因子;
- pretty(x, n):經過選取n+1個等間距的取整值,將一個連續型變量分割爲n個區間;
- cat(…, file=」mayflies」, append=TRUE):鏈接…中的對象,並將其輸出到屏幕上或文件中。
在R中,函數能夠應用到一系列數據對象上,包括標量、向量、矩陣、數組和數據框(和Matlab相似)。若是但願函數應用於矩陣的各行或者各列,能夠考慮apply()函數。
|
apply
(
x
,
MARGIN
,
FUN
,
.
.
.
)
|
MARGIN是維度的下標,1表示行、2表示列,FUN能夠是內置函數或者你本身編寫的函數,…爲可選參數。
|
mydata
<
-
matrix
(
rnorm
(
30
)
,
nrow
=
6
)
apply
(
mydata
,
1
,
mean
)
apply
(
mydata
,
2
,
mean
)
apply
(
mydata
,
2
,
mean
,
trim
=
0.2
)
|
和apply()應用於矩陣同樣,lapply()和sapply()則將函數應用於列表上。
5.3 數據處理難題的一套解決方案
回到咱們以前的問題,組合三門成績、按衡量指標排名、按區間分段打分、按姓名排序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
options
(
digits
=
3
)
Student
<
-
c
(
"John Davis"
,
"Angela Williams"
,
"Bullwinkle Moose"
,
"David Jones"
,
"Janice Markhammer"
,
"Cheryl Cushing"
,
"Reuven Ytzrhak"
,
"Greg Knox"
,
"Joel England"
,
"Mary Rayburn"
)
Math
<
-
c
(
502
,
600
,
412
,
358
,
495
,
512
,
410
,
625
,
573
,
522
)
Science
<
-
c
(
95
,
99
,
80
,
82
,
75
,
85
,
80
,
95
,
89
,
86
)
English
<
-
c
(
25
,
22
,
18
,
15
,
20
,
28
,
15
,
30
,
27
,
18
)
roster
<
-
data
.
frame
(
Student
,
Math
,
Science
,
English
,
stringsAsFactors
=
FALSE
)
z
<
-
scale
(
roster
[
,
2
:
4
]
)
score
<
-
apply
(
z
,
1
,
mean
)
roster
<
-
cbind
(
roster
,
score
)
y
<
-
quantile
(
score
,
c
(
.
8
,
.
6
,
.
4
,
.
2
)
)
roster
$
grade
[
score
>=
y
[
1
]
]
<
-
"A"
roster
$
grade
[
score
<
y
[
1
]
&
score
>=
y
[
2
]
]
<
-
"B"
roster
$
grade
[
score
<
y
[
2
]
&
score
>=
y
[
3
]
]
<
-
"C"
roster
$
grade
[
score
<
y
[
3
]
&
score
>=
y
[
4
]
]
<
-
"D"
roster
$
grade
[
score
<
y
[
4
]
]
<
-
"F"
name
<
-
strsplit
(
(
roster
$
Student
)
,
" "
)
Lastname
<
-
sapply
(
name
,
"["
,
2
)
Firstname
<
-
sapply
(
name
,
"["
,
1
)
roster
<
-
cbind
(
Firstname
,
Lastname
,
roster
[
,
-
1
]
)
roster
<
-
roster
[
order
(
Lastname
,
Firstname
)
,
]
|
最後查看roster,你應當獲得以下結果。
![學生成績數據處理結果](http://static.javashuo.com/static/loading.gif)
5.4 控制流
在正常狀況下,R程序中的語句是從上至下執行的。固然有時候你須要控制程序的執行流,即便用條件和循環。
爲了理解貫穿接下來內容的語法示例,請牢記如下概念:
- 語句(statement)是一條單獨的R語句或一組複合語句(包含在{}中的一組R語句,使用分號分割);
- 條件(cond)是一條最終被解析爲邏輯值的表達式;
- 表達式(expr)是一條數值或字符串的求值語句;
- 序列(seq)是一個數值或字符串序列。
重複和循環
循環結構重複地執行一個或一系列語句,直到某個條件再也不爲真,循環結構包括for循環和while循環。
|
for
(
var
in
seq
)
statement
while
(
cond
)
statement
|
在如下的例子中,單詞Hello被輸出了10次。
|
for
(
i
in
1
:
10
)
print
(
"Hello"
)
i
<
-
10
while
(
i
>
0
)
{
print
(
"Hello"
)
;
i
<
-
i
-
1
}
|
使用循環的時候,記得在循環裏修改標記量,避免致使死循環。
在處理大數據集中的行和列時,R中的循環可能比較低效耗時,應該儘量使用R中內建的數值/字符處理函數和apply()族函數。
條件執行
在條件執行結構中,一條或一組語句僅在知足指定條件時執行。條件執行結構包括if-else、ifelse和switch。
|
if
(
cond
)
statement
if
(
cond
)
statement1
else
statement2
ifelse
(
cond
,
statement1
,
statement2
)
switch
(
expre
,
.
.
.
)
|
再給出一個使用switch的例子,雖然簡單但清晰說明了switch的使用方法。
|
feelings
<
-
c
(
"sad"
,
"afraid"
)
for
(
i
in
feelings
)
print
(
switch
(
i
,
happy
=
"I'm glad you are happy"
,
afraid
=
"There is nothing to fear"
,
sad
=
"Cheer up"
,
angry
=
"Calm down now"
)
)
|
5.5 用戶自編函數
R最大的優勢之一就是支持用戶自行添加函數,R中許多函數也是基於已由函數構成的,一個函數的結構大概以下:
|
myfunction
<
-
function
(
arg1
,
arg2
,
.
.
.
)
{
statements
return
(
object
)
}
|
函數中的對象只在函數內部使用(記得{}的做用嗎?),返回對象的數據類型是任意的,從標量到列表皆可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
mystats
<
-
function
(
x
,
parametric
=
TRUE
,
print
=
FALSE
)
{
if
(
parametric
)
{
center
<
-
mean
(
x
)
;
spread
<
-
sd
(
x
)
}
else
{
center
<
-
median
(
x
)
;
spread
<
-
mad
(
x
)
}
if
(
print
&
parametric
)
{
cat
(
"Mean="
,
center
,
"\n"
,
"SD="
,
spread
,
"\n"
)
}
else
if
(
print
&
!
parametric
)
{
cat
(
"Median="
,
center
,
"\n"
,
"MAD="
,
spread
,
"\n"
)
}
result
<
-
list
(
center
=
center
,
spread
=
spread
)
return
(
result
)
}
|
要查看此函數的運行狀況,則須要生成一些測試數據並調用。
|
set
.
seed
(
1234
)
x
<
-
rnorm
(
500
)
y
<
-
mystats
(
x
)
z
<
-
mystats
(
x
,
parametric
=
FALSE
,
print
=
TRUE
)
|
在所得結果中,y$center爲均值(0.00184),y$spread爲標準差(1.03),而且沒有輸出結果;z$center爲中位數(-0.0207),z$spread爲絕對中位差(1.001),而且還會在屏幕上打印信息。
再來看一個使用了switch的用戶自編函數,該函數可讓用戶選擇輸出當天日期的格式。
|
mydate
<
-
function
(
type
=
"long"
)
{
switch
(
type
,
long
=
format
(
Sys
.
time
(
)
,
"%A %B %d %Y"
)
,
short
=
format
(
Sys
.
time
(
)
,
"%m-%d-%y"
)
,
cat
(
type
,
"is not a recognized type\n"
)
)
}
mydate
(
"long"
)
mydate
(
"short"
)
mydate
(
)
mydate
(
"medium"
)
|
switch中的最後一條語句給出瞭如何處理錯誤(或其餘意料以外)的輸入。除此以外,還有一些函數能夠用來爲函數添加錯誤捕獲和糾正功能,如使用warning()生成一條錯誤提示信息,用message()生成一條診斷信息,用stop()中止當前表達式的執行並提示錯誤。若是但願瞭解更多關於調試程序的內容,請閱讀Duncan Murdoch整理的「Debugging in R」。
5.6 整合與重構
R中提供了許多用於整合(aggregate)和重塑(reshape)數據的強大方法,整合數據是指將多組觀測替換爲根據這些觀測計算的描述性統計量,重塑數據是指經過修改數據的結構(行和列)來決定數據的組織方式。
如下例子中,將會使用已包含在R基本安裝中的數據框mtcars。該數據集從Motor Trend雜誌(1974)提取,描述了34種車型的設計和性能特色(汽缸數、排量、馬力、每加侖汽油行駛的英里數)。
轉置
使用函數t()便可對一個矩陣或數據框進行轉置,對於後者,行名將成爲列名。
|
cars
<
-
mtcars
[
1
:
5
,
1
:
4
]
cars
t
(
cars
)
|
整合數據
在R中使用一個或多個by變量和一個預先定義好的函數來整合(collapse)數據十分容易。
|
aggregate
(
x
,
by
,
FUN
)
|
其中x爲待整合的數據對象,by是一個變量名組成的列表,這些變量將被去掉以造成新的觀測,FUN是用來計算描述性統計量的標量函數,它將被用來計算新觀測中的值。如下代碼根據汽缸數和檔位數整合mtcars數據,並返回各個數值型變量的均值。
|
options
(
digits
=
3
)
attach
(
mtcars
)
aggdata
<
-
aggregate
(
mtcars
,
by
=
list
(
cyl
,
gear
)
,
FUN
=
mean
,
na
.
rm
=
TRUE
)
aggdata
|
將會獲得如下結果。如何理解呢?例如第一行,擁有4個氣缸和3個檔位的車型,每加侖汽油行駛英里數(mpg)均值爲21.5。須要注意的是,by中的參數必須寫在一個列表中(即便只有一個參數)。
![aggregate函數處理結果](http://static.javashuo.com/static/loading.gif)
Reshape包
reshape包是一套重構和整合數據集的萬能工具。因爲reshape包並未內置在R的標準安裝中,因此有必要經過install.packages(「reshape」)進行安裝。
咱們的操做大概包括兩部分:融合(melt),使得每一行都是一個惟一的標識符和變量的組合;重鑄(cast),將數據集變成任何須要的形狀。接下來代碼中,將處理如下樣例數據。
![測試樣例數據](http://static.javashuo.com/static/loading.gif)
融合
融合使得每一個測量變量獨佔一行,行中必須帶有惟一肯定該測量的標識符變量。
|
library
(
reshape
)
md
<
-
melt
(
mydata
,
id
=
c
(
"id"
,
"time"
)
)
|
注意,必須指定要惟一肯定每一個測量所需的變量(ID和Time),而表示測量變量名的變量(X1和X2)將由程序自動建立。
既然已經擁有了融合後的數據,如今即可以使用cast()函數將其重鑄爲任意形狀了。
重鑄
cast()函數讀取已融合的數據,並使用提供的公式和一個(可選的)用於整合數據的函數將其重鑄。
|
newdata
<
-
cast
(
md
,
formula
,
FUN
)
|
接受的公式形如:
|
rowvar1
+
rowvar2
+
.
.
.
+
~
colvar1
+
colvar2
+
.
.
.
|
rowvar1+rowvar2+…定義了要去掉的變量集合,以肯定各行的內容;colvar1+colvar2+…定義了要去掉的變量集合,以肯定各列的內容。下圖給出了使用cast()函數處理樣例數據的例子。
![melt-cast使用示例](http://static.javashuo.com/static/loading.gif)
6 基本圖形
數據分析 BY 倫大錘 閱讀量 1,059
分析數據要作的第一件事情,就是觀察它。對於每一個變量,哪些值是最多見的?值域是大是小?是否有異常觀測?變量能夠爲連續型或類別型,咱們將探索如何使用條形圖、餅圖、扇形圖、直方圖、核密度圖、箱線圖、小提琴圖和點圖等來分析和展現變量。
6.1 條形圖
條形圖經過垂直或水平的條形來展現類別型變量的分佈(頻數)。
其中的height是一個向量或一個矩陣。在接下來的例子中,將使用到vcd包中帶有的Arthritis數據框,其描述了一項探索類風溼性關節炎新療法研究的結果。
簡單的條形圖
當height爲一個向量時,向量值便肯定了各條形的高度並繪製一幅垂直的條形圖。使用參數horiz=TRUE則生成一幅水平條形圖,還可使用main、xlab和ylab等圖形參數。
在關節炎研究中,變量Improved記錄了對每位接受了安慰劑或藥物治療的病人的治療效果。其中28人有了明顯改善,14人有部分改善,而42人沒有改善。
|
library
(
vcd
)
counts
<
-
table
(
Arthritis
$
Improved
)
barplot
(
counts
,
main
=
"Simple Bar Plot"
,
xlab
=
"Improvement"
,
ylab
=
"Frequency"
)
barplot
(
counts
,
main
=
"Horizontal Bar Plot"
,
ylab
=
"Improvement"
,
xlab
=
"Frequency"
,
horiz
=
TRUE
)
|
其實若是要繪製的類別型變量是一個因子或有序型因子,就能夠直接使用函數plot()快速建立一幅垂直條形圖。因爲Arthritis$Improved是一個因子,所以如下代碼也能夠達到一樣效果。
|
plot
(
Arthritis
$
Improved
,
main
=
"Simple Bar Plot"
,
xlab
=
"Improved"
,
ylab
=
"Frequency"
)
plot
(
Arthritis
$
Improved
,
horiz
=
TRUE
,
main
=
"Horizontal Bar Plot"
,
xlab
=
"Frequency"
,
ylab
=
"Improved"
)
|
堆砌條形圖和分組條形圖
若是height是一個矩陣而不是一個向量,則繪圖結果將是一幅堆砌條形圖或分組條形圖。beside默認爲FALSE表示堆砌,不然將分組。考慮治療類型和改善狀況的列聯表:
|
library
(
vcd
)
counts
<
-
table
(
Arthritis
$
Improved
,
Arthritis
$
Treatment
)
barplot
(
counts
,
main
=
"Stacked Bar Plot"
,
xlab
=
"Treatment"
,
ylab
=
"Frequency"
,
col
=
c
(
"red"
,
"yellow"
,
"green"
)
,
legend
=
rownames
(
counts
)
)
barplot
(
counts
,
main
=
"Grouped Bar Plot"
,
xlab
=
"Treatment"
,
ylab
=
"Frequency"
,
col
=
c
(
"red"
,
"yellow"
,
"green"
)
,
legend
=
rownames
(
counts
)
,
beside
=
TRUE
)
|
第一個barplot函數繪製了一幅堆砌條形圖,而第二個繪製了一幅分組條形圖。圖中圖例和條形圖疊加了,不過這能夠經過格式化和放置圖例的方法解決,故不用擔憂。
均值條形圖
條形圖並不必定要基於計數數據或頻率數據,也可使用數據整合函數並將結果傳遞給barplot()函數,來建立表示均值、中位數、標準差等條形圖。
條形圖的微調
有多種方法能夠微調條形圖的外觀:
- 隨着條數的增多,可使用cex.names減少字號避免標籤重疊;
- name.arg容許用一個字符向量指定條形的標籤名;
- 其餘通用圖形參數。
如下代碼中,旋轉了條形的標籤(las)、修改了標籤文本、增長了y邊界的大小(mar)、縮小了字體大小(cex.names)。
|
par
(
mar
=
c
(
5
,
8
,
4
,
2
)
)
par
(
las
=
1
)
counts
<
-
table
(
Arthritis
$
Improved
)
barplot
(
counts
,
main
=
"Treatment Outcomes"
,
horiz
=
TRUE
,
cex
.
names
=
0.8
,
names
.
arg
=
c
(
"No Improvement"
,
"Some Improvement"
,
"Marked Improvement"
)
)
|
棘狀圖
還有另外一種特殊的條形圖:棘狀圖(spinogram)。棘狀圖對堆砌條形圖進行了重縮放,使得每一個條形的高度均爲1,每一段的高度表示所佔比例。棘狀圖可由vcd包中的spine()繪製:
|
library
(
vcd
)
attach
(
Arthritis
)
counts
<
-
table
(
Treatment
,
Improved
)
spine
(
counts
,
main
=
"Spinogram Example"
)
|
經過棘狀圖能夠看出,治療組和安慰劑組相比,得到顯著改善的患者比例更高。
6.2 餅圖
雖然餅圖在商業世界中使用普遍,可是多數統計學家卻並不支持它,由於相對於餅圖的面積,人類對條形圖或點圖中的長度判斷更加精確。也許是由於這個緣由,R中餅圖的選項和其餘統計軟件相比十分有限。
其中x是一個非負數值向量,表示各個扇形的面積,labels則是各扇形標籤的字符型向量。如下代碼繪製了三幅餅圖,最簡單的餅圖、顯示百分比的餅圖和三維餅圖。
|
par
(
mfrow
=
c
(
1
,
3
)
)
slices
<
-
c
(
10
,
12
,
4
,
16
,
8
)
lbs
<
-
c
(
"US"
,
"UK"
,
"Australia"
,
"Germany"
,
"France"
)
pie
(
slices
,
labels
=
lbs
,
main
=
"Simple Pie Chart"
)
pct
<
-
round
(
slices
/
sum
(
slices
)
*
100
)
lbs2
<
-
paste
(
lbs
,
" "
,
pct
,
"%"
,
sep
=
""
)
pie
(
slices
,
labels
=
lbs2
,
col
=
rainbow
(
length
(
lbs2
)
)
,
main
=
"Pie Chart with Percentages"
)
library
(
plotrix
)
pie3D
(
slices
,
labels
=
lbs
,
explode
=
0.1
,
main
=
"3D Pie Chart"
)
|
餅圖讓比較各扇形的值變得困難,除非這些值被附加在標籤上。爲了彌補這一缺點,產生了一種餅圖的變種:扇形圖。扇形圖爲用戶提供了一種同時展現相對數量和相互差別的方法,各個扇形相互疊加而且擁有不一樣半徑,從而使得全部扇形都是可見的。
|
library
(
plotrix
)
slices
<
-
c
(
10
,
12
,
4
,
16
,
8
)
lbs
<
-
c
(
"US"
,
"UK"
,
"Australia"
,
"Germany"
,
"France"
)
fan
.
plot
(
slices
,
labels
=
lbs
,
main
=
"Fan Plot"
)
|
6.3 直方圖
直方圖經過在X軸上將值域分割爲必定數量的組,在Y軸上顯示相應值的頻數,展現了連續型變量的分佈。使用如下函數建立直方圖:
x爲一個由數據值組成的數值向量,參數freq=FALSE表示根據機率密度而不是頻數繪製圖形,參數breaks用於控制組的數量。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
par
(
mfrow
=
c
(
2
,
2
)
)
hist
(
mtcars
$
mpg
)
hist
(
mtcars
$
mpg
,
breaks
=
12
,
col
=
"red"
,
xlab
=
"Miles Per Gallon"
,
main
=
"Colored histogram with 12 bins"
)
hist
(
mtcars
$
mpg
,
freq
=
FALSE
,
breaks
=
12
,
col
=
"red"
,
xlab
=
"Miles Per Gallon"
,
main
=
"Histogram, rug plot ,density curve"
)
rug
(
jitter
(
mtcars
$
mpg
)
)
lines
(
density
(
mtcars
$
mpg
)
,
col
=
"blue"
,
lwd
=
2
)
x
<
-
mtcars
$
mpg
h
<
-
hist
(
x
,
breaks
=
12
,
col
=
"red"
,
xlab
=
"Miles Per Gallon"
,
main
=
"Histogram with normal curve and box"
)
xfit
<
-
seq
(
min
(
x
)
,
max
(
x
)
,
length
=
40
)
yfit
<
-
dnorm
(
xfit
,
mean
=
mean
(
x
)
,
sd
=
sd
(
x
)
)
yfit
<
-
yfit
*
diff
(
h
$
mids
[
1
:
2
]
)
*
length
(
x
)
lines
(
xfit
,
yfit
,
col
=
"blue"
,
lwd
=
2
)
box
(
)
|
第一幅直方圖未指定任何選項,共建立了五個組而且顯示了默認的標題和座標軸標籤;第二幅直方圖共12個分組,並使用紅色填充條形;第三幅直方圖保留了第二幅圖的內容,併疊加了一條密度曲線(density)和軸須圖(rug),密度曲線是數據分佈一個的核密度估計,而軸須圖是實際數據值的一種一維呈現方式;第四幅圖和第二幅相似,還有一條疊加的正態曲線和一個將圖形圍繞起來的盒型。
6.4 核密度圖
核密度估計是用於估計隨機變量機率密度函數的一種非參數方法。
其中x爲一個數值型向量,因爲plot()函數會建立一幅新的圖形,因此要向一幅已經存在的圖形上疊加一條密度曲線時,可使用lines()函數。
|
par
(
mfrow
=
c
(
2
,
1
)
)
d
<
-
density
(
mtcars
$
mpg
)
plot
(
d
)
plot
(
d
,
main
=
"Kernel Density of Miles Per Gallon"
)
polygon
(
d
,
col
=
"red"
,
border
=
"blue"
)
rug
(
mtcars
$
mpg
,
col
=
"brown"
)
|
第一幅圖是默認設置建立的最簡圖形,而第二幅圖中添加了標題,並將曲線修改爲藍色、使用實心紅色填充了曲線下方的區域、添加了棕色的軸須圖。
使用sm包中的sm.density.compare()函數能夠向圖形疊加兩組或更多核密度圖,格式爲:
|
sm
.
density
.
compare
(
x
,
factor
)
|
其中x爲一個數值型向量,factor爲一個分組變量。如下代碼比較了擁有4個、6個或8個汽缸車型的每加侖汽油行駛英里數。
|
par
(
lwd
=
2
)
library
(
sm
)
attach
(
mtcars
)
cyl
.
f
<
-
factor
(
cyl
,
levels
=
c
(
4
,
6
,
8
)
,
labels
=
c
(
|