R語言學習(五)高階資料管理
阿新 • • 發佈:2018-12-18
(一)數值和字元處理函式
數學函式:
統計函式:
輸入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