R語言實戰:高級數據管理

2021-03-02 旺德福居

本文內容來自《R 語言實戰》(R in Action, 2nd),有部分修改

數值和字符處理函數統計函數

x <- 1:8
x

[1] 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
meanx

[1] 4.5

css <- sum((x - meanx)^2)
sdx <- sqrt(css / (n - 1))
sdx

[1] 2.44949

scale() 函數

scale(x)

[,1]
[1,] -1.4288690
[2,] -1.0206207
[3,] -0.6123724
[4,] -0.2041241
[5,] 0.2041241
[6,] 0.6123724
[7,] 1.0206207
[8,] 1.4288690
attr(,"scaled:center")
[1] 4.5
attr(,"scaled:scale")
[1] 2.44949

概率函數

runif(5)

[1] 0.3368141 0.3301134 0.9172243 0.7132270 0.5433076

runif(5)

[1] 0.5018690 0.5012920 0.2691537 0.1911182 0.1047126

set.seed() 設置隨機數種子

set.seed(1234)
runif(5)

[1] 0.1137034 0.6222994 0.6092747 0.6233794 0.8609154

set.seed(1234)
runif(5)

[1] 0.1137034 0.6222994 0.6092747 0.6233794 0.8609154

多元正態數據

MASS 包 mvrnorm() 函數

library(MASS)
options(digits=3)

mean <- c(230.7, 146.7, 3.6)
sigma <- matrix(
c(
15360.8, 6721.2, -47.1,
6721.2, 4000.9, -16.5,
-47.1, -16.5, 0.3
),
nrow=3,
ncol=3
)

生成數據

set.seed(1234)
data <- mvrnorm(500, mean, sigma)
data <- as.data.frame(data)
names(data) <- c("y", "x1", "x2")

dim(data)

[1] 500 3

head(data, n=10)

y x1 x2
1 94.2 51.1 3.43
2 249.6 195.6 3.81
3 373.3 189.7 2.51
4 -59.9 15.4 4.71
5 305.9 123.3 3.41
6 290.1 182.2 2.74
7 140.7 154.9 4.41
8 169.4 102.2 3.64
9 165.5 104.8 3.50
10 120.7 96.2 4.09

將函數應用與矩陣和數據框

a <- 5
sqrt(5)

[1] 2.24

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.9636 0.216 0.289 0.913
[2,] 0.2068 0.240 0.804 0.353
[3,] 0.0862 0.197 0.378 0.931

log(c)

[,1] [,2] [,3] [,4]
[1,] -0.0371 -1.53 -1.241 -0.0912
[2,] -1.5762 -1.43 -0.218 -1.0402
[3,] -2.4511 -1.62 -0.972 -0.0710

mean(c)

[1] 0.465

apply() 函數

data <- matrix(rnorm(30), nrow=6)
data

[,1] [,2] [,3] [,4] [,5]
[1,] 0.459 1.203 1.234 0.591 -0.281
[2,] -1.261 0.769 -1.891 -0.435 0.812
[3,] -0.527 0.238 -0.223 -0.251 -0.208
[4,] -0.557 -1.415 0.768 -0.926 1.451
[5,] -0.374 2.934 0.388 1.087 0.841
[6,] -0.604 0.935 0.609 -1.944 -0.866

dim(data)

[1] 6 5

1 表示計算每行的值

apply(data, 1, mean)

[1] 0.641 -0.401 -0.194 -0.136 0.975 -0.374

2 表示計算每列的值

apply(data, 2, mean)

[1] -0.478 0.777 0.148 -0.313 0.292

apply(data, 2, mean, trim=0.2)

[1] -0.516 0.786 0.386 -0.255 0.291

一個數據處理難題

options(digits=2)

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
)
roster

Student math science english
1 John Davis 502 95 25
2 Angela Williams 600 99 22
3 Bullwinkle Moose 412 80 18
4 David Jones 358 82 15
5 Janice Markhammer 495 75 20
6 Cheryl Cushing 512 85 28
7 Reuven Ytzrhak 410 80 15
8 Greg Knox 625 95 30
9 Joel England 573 89 27
10 Mary Rayburn 522 86 18

計算綜合得分

z <- scale(roster[, 2:4])
z

math science english
[1,] 0.013 1.078 0.587
[2,] 1.143 1.591 0.037
[3,] -1.026 -0.847 -0.697
[4,] -1.649 -0.590 -1.247
[5,] -0.068 -1.489 -0.330
[6,] 0.128 -0.205 1.137
[7,] -1.049 -0.847 -1.247
[8,] 1.432 1.078 1.504
[9,] 0.832 0.308 0.954
[10,] 0.243 -0.077 -0.697
attr(,"scaled:center")
math science english
501 87 22
attr(,"scaled:scale")
math science english
86.7 7.8 5.5

score <- apply(z, 1, mean)
roster <- cbind(roster, score)
roster

Student math science english score
1 John Davis 502 95 25 0.56
2 Angela Williams 600 99 22 0.92
3 Bullwinkle Moose 412 80 18 -0.86
4 David Jones 358 82 15 -1.16
5 Janice Markhammer 495 75 20 -0.63
6 Cheryl Cushing 512 85 28 0.35
7 Reuven Ytzrhak 410 80 15 -1.05
8 Greg Knox 625 95 30 1.34
9 Joel England 573 89 27 0.70
10 Mary Rayburn 522 86 18 -0.18

評分

y <- quantile(
score,
c(.8, .6, .4, .2)
)
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

Student math science english score grade
1 John Davis 502 95 25 0.56 B
2 Angela Williams 600 99 22 0.92 A
3 Bullwinkle Moose 412 80 18 -0.86 D
4 David Jones 358 82 15 -1.16 F
5 Janice Markhammer 495 75 20 -0.63 D
6 Cheryl Cushing 512 85 28 0.35 C
7 Reuven Ytzrhak 410 80 15 -1.05 F
8 Greg Knox 625 95 30 1.34 A
9 Joel England 573 89 27 0.70 B
10 Mary Rayburn 522 86 18 -0.18 C

按姓氏和名字排序

name <- strsplit((roster$Student), " ")
last_name <- sapply(name, "[", 2)
first_name <- sapply(name, "[", 1)
roster <- roster[order(last_name, first_name),]
roster

Student math science english score grade
6 Cheryl Cushing 512 85 28 0.35 C
1 John Davis 502 95 25 0.56 B
9 Joel England 573 89 27 0.70 B
4 David Jones 358 82 15 -1.16 F
8 Greg Knox 625 95 30 1.34 A
5 Janice Markhammer 495 75 20 -0.63 D
3 Bullwinkle Moose 412 80 18 -0.86 D
10 Mary Rayburn 522 86 18 -0.18 C
2 Angela Williams 600 99 22 0.92 A
7 Reuven Ytzrhak 410 80 15 -1.05 F

控制流

feelings <- c("sad", "afraid")
for (i in feelings) {
print(
switch(
i,
happy = "I am glad you are happy",
afraid = "There is nothing to fear",
sad = "Cheer up",
angry = "Calm down now"
)
)
}

[1] "Cheer up"
[1] "There is nothing to fear"

用戶自編函數

my_stats <- 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 <- my_stats(x)
y

$center
[1] 0.0018

$spread
[1] 1

y <- my_stats(x, parametric=FALSE, print=TRUE)
y

Median= -0.021
MAD= 1
$center
[1] -0.021

$spread
[1] 1

my_date <- 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")
)
}

my_date("long")

[1] "星期三 十二月 30 2020"

my_date("short")

[1] "12-30-20"

my_date()

[1] "星期三 十二月 30 2020"

my_date("medium")

medium is not a recognized type

整合與重構

aggregate and reshape

head(mtcars)

mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21 6 160 110 3.9 2.6 16 0 1 4 4
Mazda RX4 Wag 21 6 160 110 3.9 2.9 17 0 1 4 4
Datsun 710 23 4 108 93 3.8 2.3 19 1 1 4 1
Hornet 4 Drive 21 6 258 110 3.1 3.2 19 1 0 3 1
Hornet Sportabout 19 8 360 175 3.1 3.4 17 0 0 3 2
Valiant 18 6 225 105 2.8 3.5 20 1 0 3 1

轉置

cars <- mtcars[1:5, 1:4]
cars

mpg cyl disp hp
Mazda RX4 21 6 160 110
Mazda RX4 Wag 21 6 160 110
Datsun 710 23 4 108 93
Hornet 4 Drive 21 6 258 110
Hornet Sportabout 19 8 360 175

t(cars)

Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout
mpg 21 21 23 21 19
cyl 6 6 4 6 8
disp 160 160 108 258 360
hp 110 110 93 110 175

整合數據

options(digits=3)
attach(mtcars)
agg_data <- aggregate(
mtcars,
by=list(cyl, gear),
FUN=mean,
na.rm=TRUE
)
detach(mtcars)
agg_data

Group.1 Group.2 mpg cyl disp hp drat wt qsec vs am gear carb
1 4 3 21.5 4 120 97 3.70 2.46 20.0 1.0 0.00 3 1.00
2 6 3 19.8 6 242 108 2.92 3.34 19.8 1.0 0.00 3 1.00
3 8 3 15.1 8 358 194 3.12 4.10 17.1 0.0 0.00 3 3.08
4 4 4 26.9 4 103 76 4.11 2.38 19.6 1.0 0.75 4 1.50
5 6 4 19.8 6 164 116 3.91 3.09 17.7 0.5 0.50 4 4.00
6 4 5 28.2 4 108 102 4.10 1.83 16.8 0.5 1.00 5 2.00
7 6 5 19.7 6 145 175 3.62 2.77 15.5 0.0 1.00 5 6.00
8 8 5 15.4 8 326 300 3.88 3.37 14.6 0.0 1.00 5 6.00

reshape2

示例數據,包括兩個標識符變量 ID 和 Time,兩個測量變量 X1 和 X2

my_data <- data.frame(
ID=c(1, 1, 2, 2),
Time=c(1, 2, 1, 2),
X1=c(5, 3, 6, 2),
X2=c(6, 5, 1, 4)
)
my_data

ID Time X1 X2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4

library(reshape2)

融合 melt()

每一行都是一個單獨的測量,表示為:

唯一標識符 + 測量變量

md <- melt(my_data, id=c("ID", "Time"))
md

ID Time variable value
1 1 1 X1 5
2 1 2 X1 3
3 2 1 X1 6
4 2 2 X1 2
5 1 1 X2 6
6 1 2 X2 5
7 2 1 X2 1
8 2 2 X2 4

重鑄 dcast()

不執行整合

相當於被重塑 (reshape)

dcast(md, ID + Time ~ variable)

ID Time X1 X2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4

dcast(md, ID + variable ~ Time)

ID variable 1 2
1 1 X1 5 3
2 1 X2 6 5
3 2 X1 6 2
4 2 X2 1 4

dcast(md, ID ~ variable + Time)

ID X1_1 X1_2 X2_1 X2_2
1 1 5 3 6 5
2 2 6 2 1 4

執行整合

附加整合函數,例如 mean

dcast(md, ID ~ variable, mean.default)

ID X1 X2
1 1 4 5.5
2 2 4 2.5

dcast(md, Time~variable, mean.default)

Time X1 X2
1 1 5.5 3.5
2 2 2.5 4.5

dcast(md, ID~Time, mean.default)

ID 1 2
1 1 5.5 4
2 2 3.5 3

參考

R 語言實戰

《圖形初階》

《基本數據管理》

題圖由 ArtTower 在 Pixabay 上發布。

相關焦點

  • R語言實戰(5) ——高級數據管理
    往期回顧:R語言實戰(1)——R語言介紹R語言實戰(2)——創建數據集R語言實戰(3)
  • R語言的數據管理
    這部分內容為我學習《R語言實戰》中數據管理的部分所做的筆記。
  • 《數據挖掘R語言實戰》圖書介紹,數據挖掘相關人員看過來!
    今天介紹一本書《數據挖掘R語言實戰》。數據挖掘技術是當下大數據時代最關鍵的技術,其應用領域及前景不可估量。R是一款極其優秀的統計分析和數據挖掘軟體,R語言的特點是入門容易,使用簡單。這本書側重使用R進行數據挖掘,重點進述了R的數據挖掘流程、算法包的使用及相關工具的應用,同時結合大量精選的數據挖掘實例對R軟體進行深入潛出和全面的介紹,以便讀者能深刻理解R的精髓並能快速、高效和靈活地掌握使用R進行數據挖掘的技巧。本書以數據預處理、基本算法及應用和高級算法及應用這三篇展示。
  • 從零開始的R語言開荒日記 | 假期R語言速成(三)R的簡單數據操作與數據管理
    R的數據處理方式豐富多樣,不過,要想用R處理一份數據,首先需要學會如何將數據導入R以及如何對數據進行預處理(基本數據管理)。
  • R語言系列3:高級數據管理
    R語言系列3:高級數據管理此文內容為《R語言實戰》的筆記,人民郵電出版社出版。從高中電腦課學VB開始,大一課內開始學習C++,到後來大二為了數模學習Matlab,到大三為了搞深度學習自學Python,到研究生之初學習Stata——選擇一門語言對我來說就像是小時候玩冒險島,到10級的時候是轉戰士好還是弓箭手好一般的糾結。我查閱了很多B乎的文章,最後覺得可能R比較合適現在的我。
  • R語言實戰(14)——主成分分析和因子分析
    往期回顧:R語言實戰(4) ——數據管理R語言實戰(5) ——高級數據管理R語言實戰(6)——
  • 【語言班】R語言數據分析與可視化高級研修班(4.26-29)
    R語言是用於數據分析、數據可視化的高級程式語言,其功能包括:數據存儲和處理、科學計算工具;能夠進行幾乎所有的統計分析;內置豐富便捷的數據可視化功能
  • R語言實戰(7)——基本統計分析
    往期回顧:R語言實戰(1)——R語言介紹R語言實戰(2)——創建數據集R語言實戰(3)——圖形初階
  • 數據分析學習入門寶典 狗熊會《R語言:從數據思維到數據實戰》
    近日,數據產業高端智庫,狗熊會推出又一教材力作——《R語言:從數據思維到數據實戰》。這本書可以作為高等院校數據科學相關專業教學的通用教材,也是新手學習的入門寶典。全書採用實例講解,新穎有趣,深入淺出,把R語言簡單靈活、包羅萬象的特點體現得淋漓盡致。無論讀者數據分析基礎如何,都能通過這本書快速上手,提升實戰能力。
  • R語言對接高級語言Fortran
    (1)Fortran是當之無愧的性能之王,在本文的測試中可以看到Fortran代碼的效率是Rcpp的2倍、Julia的4倍、python的30倍、R語言的90倍。在for循環密集的代碼中,Fortran可以輕鬆達到R語言的200倍;(2)很多古老的、但專業上通用的模型採用Fortran語言編寫,翻譯成其他語言,人力所不能及。為何對接到R語言?
  • R語言數據清洗實戰——高效list解析方案
    杜雨:EasyCharts團隊成員,R語言中文社區專欄作者。興趣方向為:Excel商務圖表,R語言數據可視化,地理信息數據可視化。個人公眾號:數據小魔方(微信ID:datamofang) ,「數據小魔方」創始人。
  • R語言實戰:廣義線性模型
    本文內容來自《R 語言實戰》(R in Action, 2nd),有部分修改廣義線性模型和 glm() 函數標準線性模型:假設 Y
  • R語言學習路線和常用數據挖掘包
    對於初學R語言的人,最常見的方式是:遇到不會的地方,就跑到論壇上吼一嗓子,然後欣然or悲傷的離去,一直到遇到下一個問題再回來。那麼,眾多書籍中,一個生手應該從哪一本著手呢?入門之後如何才能把自己練就成某個方面的高手呢?相信這是很多人心中的疑問。有這種疑問的人有福了,因為筆者將根據自己的經歷總結一下R語言書籍的學習路線圖以使Ruser少走些彎路。本文分為6個部分,分別介紹初級入門,高級入門,繪圖與可視化,計量經濟學,時間序列分析,金融等。
  • R語言實戰:回歸
    本文內容來自《R 語言實戰》(R in Action, 2nd),有部分修改回歸的多面性簡單線性多項式
  • R語言實戰(19)——使用ggplot2進行高級繪圖
    後臺回復「R語言實戰」即可獲取二維碼加入R語言實戰學習討論群。19.1 ggplot2包介紹ggplot2包是使用R進行數據可視化的重要工具,提供一個全面的、基於語法的、連貫一致的圖形生成系統,允許用戶創建新穎的、有創新性的數據可視化圖形。ggplot2的語法1. 在ggplot2中,圖是採用串聯起來(+)號函數創建的。每個函數修改屬於自己的部分。
  • R語言數據實戰 | 數據讀入
    對於實際項目,一種常用的做法是先把R的工作目錄設定在某個文件夾內,把要用到的數據文件都放入其中,方便讀寫。比如,首先可以用getwd()獲取R語言的工作目錄(這裡顯示的工作目錄在一個叫bear_read的文件夾中),然後當把數據movie.txt放入該文件夾時,就不需要再輸入長長的路徑,直接用文件名讀入就沒問題了。
  • R語言從入門到精通:Day6-R語言數據操作進階及控制結構
    最近經過前面幾次推文的學習,我們的R語言教程已經講解了快1/3的內容,相信大家對R語言已經有了初步的了解,特別是感受了R語言在數據處理領域的強大功能
  • R語言-初識與數據結構
    Robert Gentleman1997年以後,形成了一個核心團隊對R 語言原始碼進行管理與修改。S語言:1976年貝爾實驗室發展起來的數據交互分析系統;是一種高級程序語言,很好地統計應用快速開發系統。
  • R語言實戰(2)——創建數據集【學習分享】
    往期回顧:R語言實戰(1)——R語言介紹【學習分享】引言:上一章我們通過簡單的例子了解了R語言及R語言能實現的一些功能
  • 【免費直播課程】R-GIS:R語言地統計與空間製圖實踐技術 應用
    在本次課程中,我們將結合一些經典的例子培訓R語言在空間數據處理、管理以及可視化的操作,從空間數據計量、空間數據插值、空間數據建模、機器學習、數據可視化、知識圖譜等方面讓你全方位進行GIS操作和製圖,從此擺脫ArcGIS的複雜操作,實現空間數據的自動化、快遞批量操作、建模及其可視化。