1. 程式人生 > >R語言學習(五)高階資料管理

R語言學習(五)高階資料管理

(一)數值和字元處理函式

數學函式:

統計函式: 

輸入help( )可以檢視函式的具體用法

z <- mean(x)

z <- mean(x,trim=0.05,na.rm=TRUE)   ;;丟棄最大最小百分之5後的截尾平均書

 均值與標準差的計算:

第一種方法:
> x <- c(1,2,3,4,5,6,7,8)
> mean(x)
[1] 4.5
> sd(x)
[1] 2.44949


第二種方法:
> n <- length(x)
> meanx <- sum(x)/n
> css <- sum((x-meanx)^2)         css為修正平方和
> sdx <- sqrt(css/(n-1))
> meanx
[1] 4.5
> sdx
[1] 2.44949

資料的標準化:

newdata <- scale(mydata)     ;;預設進行均值為0,標準差為1的標準化

newdata <- scale(mydata)*SD+M     ;;進行任意均值SD,任意標準差M的標準化

newdata <- transform(mydata,myvar=scale(mylar)*10+50)

;;將變數myvar標準化為均值為50,標準差為10的變數

概率函式:

在R中,概率函式的形如:

[dpqr]distribution_abbreviation()

d = 密度函式
p = 分佈函式
q = 分位數函式
r = 生成隨機數

比如:
> pnorm(1.96)      ;; 求標準正態曲線下方的面積
[1] 0.9750021
> qnorm(0.9,mean=500,sd=100)     ;;均值500,標準差為100的正態分佈0.9分位點的值
[1] 628.1552
> rnorm(50,mean=50,sd=10)        ;;生成10個均值為50,標準差為10的的正態隨機數
 [1] 50.73704 53.63381 53.36842 57.15589 57.74823 72.08630
 [7] 59.87715 44.13800 42.74057 40.46776

d可以用來根據x向量生成對應的正態曲線:
x<- pretty(c(-3,3),30)
y <- dnorm(x)
plot(x,y,
     type = "l",
     xlab="Normal Deviate",
     ylab="Density",
     yaxs="i")

1.設定隨機數種子:

每次生成偽隨機數,函式都會使用一個不同的種子,因此也會產生不同的結果,可以用set.seed()指定這個種子。

> runif(5)    ;;生成5個0-1區間上服從均勻分佈的偽隨機數
[1] 0.7410421 0.3810480 0.6375341 0.9794718 0.3376061
> runif(5)
[1] 0.63570440 0.79909592 0.65072135 0.00996389 0.72452497
> set.seed(1234)  ;;設定固定的種子
> runif(4)    
[1] 0.1137034 0.6222994 0.6092747 0.6233794
> set.seed(1234)
> runif(4)
[1] 0.1137034 0.6222994 0.6092747 0.6233794

2.生成多元正態資料:

 需要用到MASS包裡的mvnorm()函式:

mvnorm(n, mean,sigma)

n為需要的樣本大小
mean為均值向量
sigma是方差-協方差矩陣

比如需要從一個引數如下所示的三元正態分佈中抽取500個觀測:

均值向量 230.7 146.7 3.6
協方差陣 15360.8 6721.2 -47.1
6721.2 4700.9 -16.5
-47.1 -16.5 0.3
> 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(400,mean,sigma)

mydata <- as.data.frame(mydata)

names(mydata) <- c("y","x1","x2")

> dim(mydata)
[1] 400   3

> head(mydata,n=10)
       y    x1   x2
1   62.1 117.2 3.83
2  265.4 161.9 2.96
3  356.9 225.5 3.25
4  -72.3  38.3 5.28
5  290.3 157.8 3.34
6  295.4 171.5 3.69
7  184.4  62.4 3.17
8  145.0 152.7 3.88
9  152.8 131.0 4.10
10 120.1  96.4 3.80

字元處理函式

其它實用函式 

> name <- "Bob"
> cat("Hello",name,"\b.\n","Isn\'t R","\t","GREAT?\n")
Hello Bob.
 Isn't R 	 GREAT?

\n   新行
\t   製表符
\'   單引號
\b   退格

 (二)將函式應用於矩陣和資料框

> a <-5
> b <- c(1.243,5.654,2.99)
> round(b)
[1] 1 6 3
> c <- matrix(runif(12),nrow=3)
> c
       [,1]  [,2]   [,3]  [,4]
[1,] 0.0804 0.280 0.0623 0.919
[2,] 0.5621 0.809 0.8275 0.852
[3,] 0.9914 0.953 0.8716 0.760
> log(c)
        [,1]    [,2]   [,3]    [,4]
[1,] -2.5206 -1.2729 -2.776 -0.0846
[2,] -0.5762 -0.2124 -0.189 -0.1602
[3,] -0.0086 -0.0482 -0.137 -0.2743
> mean(c)
[1] 0.664

如果想把函式用到某個維度上,可以用apply( )函式:

apply(x, margin,FUN,……)

;;x為資料物件,margin是維度的下標,fun是指定的函式。

maigin = 1 表示行

margin=2 表示列
mydata <- matrix(rnorm(30),nrow=6)
mydata
apply(mydata,1,mean)     ;;行均值
apply(mydata,2,mean)     ;;列均值
apply(mydata,2,mean,trim=0.2)  ;;最高和最低20%的值均被忽略)

(三) 一個例子

options(digits = 2)
;;設定顯示小數點後兩位

Students <- 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(Students,Math,Science,English,
                     stringsAsFactors = FALSE)

;;生成roster資料框

z<- scale(roster[,2:4])     ;;對roster的2到四列進行標準化,並生成z資料框
score <- apply(z,1,mean)      ;;對z資料框按照行取均值,生成score向量
roster <- cbind(roster,score)     ;;將score向量合併到roster資料框中

y<- quantile(score,c(.8,.6,.4,.2))    ;;獲得score的幾個分界點
> y
  80%   60%   40%   20%         
 0.74  0.44 -0.36 -0.89

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"

;;在roster中根據score的值建立grade變數

name <- strsplit((roster$Students)," ")     ;;將roster的Students變數中的名字拆分,返回到一個列表中
> name
[[1]]
[1] "John"  "Davis"

[[2]]
[1] "Angela"   "Williams"

[[3]]
[1] "Bullwinkle" "Moose"     

[[4]]
[1] "David" "Jones"

[[5]]
[1] "Janice"     "Markhammer"

[[6]]
[1] "Cheryl"  "Cushing"

[[7]]
[1] "Reuven"  "Ytzrhak"

[[8]]
[1] "Greg" "Knox"

[[9]]
[1] "Joel"    "England"

[[10]]
[1] "Mary"    "Rayburn"

Lastname <- sapply(name,"[",2)    ;;提取列表中每個成分的第一個元素
Firstname <- sapply(name,"[",1)    ;;提取列表中每個成分的第二個元素
roster <- cbind(Firstname,Lastname,roster[,-1])   
;;將他們新增到花名冊中,通過-1可以將student丟棄
roster <- roster[order(Lastname,Firstname),]
roster