R實戰 第三篇:數據處理(基礎)
數據結構用於存儲數據,不同的數據結構對應不同的操作方法,對應不同的分析目的,應選擇合適的數據結構。在處理數據時,為了便於檢查數據對象,可以通過函數attributes(x)來查看數據對象的屬性,str(x)函數用於查看R對象的內部結構,通過print(x)函數,顯示數據對象存儲的內容,該函數把數據打印到控制臺上,另外,RStudio提供了一個可視化查看數據的函數View(x)。
一,處理數據的函數
標量通常是常量,每一個標量都有特定的數據類型,常用的數據類型是數值類型,字符類型,邏輯類型和日期類型。
對於邏輯類型,可能的值是TRUE和FALSE,用於邏輯操作的運算符:與(&)、或(|)、非(!)
R語言中經常會遇到一些特殊值:
- 缺失值 NA(Not Avaiable),是不可用的縮寫,通過函數is.na(x)來測試變量的值是否為NA;
- NaN為“不是一個數”,意味著計算沒有數學意義;
- NULL值,空值,表示一個空的變量,不會占用任何空間,通過函數is.null(x)來測試變量的值是否為NULL;
- 特殊的數字:Inf、-Inf 表示正無窮,負無窮;
1,日期類型
日期類型比較特殊,日期值通常以字符串的形式輸入到R中,然後使用as.Date()函數轉換為以數值形式存儲的日期變量,as.Date()函數的語法是:
as.Date(x, input_format)
參數input_format是日期值的輸入格式,默認的輸入格式是"yyyy-mm-dd":
mydate <- as.Date("2017-01-13")
輸入參數可以自定義日期的輸入格式:
- %d:數字表示的天(0-31)
- %a:縮寫的星期名(Mon、Tue、Wed、Thur、Fri、Sat、Sun)
- %m:月份(00、01、02等)
- %b:縮寫的月份(Jan、Feb、Mar等)
- %B:英語月份(January、February 、March等)
- %y:兩位數的年份
- %Y:四位數的年份
舉個例子,把默認的日期格式轉換為特定類型的日期格式:
as.Date("2018-03-05","%Y-%m-%d")
把日期類型轉換為字符串類型,可以使用format()函數,指定日期的輸出格式:
format(mydate,format="output_format")
例如,把當前日期按照特定的格式輸出:
today<-Sys.Date()
format(today,format("%B %d %Y"))
也可以直接把日期類型轉換為字符串類型:
strdate <- as.character(mydate)
2,字符類型
常用的字符類型的操作:
- 查看字符數量: nchar(x)
- 提取或替換字符的子串: substr(x, start,stop)
- 匹配模式,返回下標:grep(pattern, x, ignore.case=FALSE, fixed=FALSE),從x中搜索匹配模式的字符的下標
- 匹配模式,並替換:sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE),從x中搜索匹配模式的字符,並以文本replacement替換
- 分割字符: strsplit(x,split,fixed=FALSE)
- 連接字符: paste(...,sep=" "),把多個字符連接成一個長的字符串,分隔符由參數sep指定
- 字符的大小寫轉換: toupper(x),tolower(x)
3,數值類型
對於數值類型,常用的數學函數是:
- 絕對值:abs(x)
- 平方根:sqrt(x)
- 不小於x的最小整數:ceiling(x)
- 不大於x的最大整數:floor(x)
- 把x舍入為指定位的小數:round(x,digits=n)
- 把x攝入有效位數的小數:signif(x,digits=n)
- 截取整數部分,舍棄小數部分:trunc(x)
常用的統計函數:
- 平均值:mean(x)
- 中位數:median(x)
- 絕對中位數:mad(x)
- 分位數:quantile(x,probs)
- 標準差:sd(x)
- 方差:var(x)
- 值域:range(x)
- 求和:sum(x)
- 最值:min(x),max(x)
- 標準化:scale(x, center=TRUE, scale=TRUE)
分割區間的函數:
- 把連續型變量分割位有著n個水平的因子:cut(x, n, ordered_result)
- 創建美觀的分割點,通過選取n+1個等間距的取整值,把一個連續型變量分割位n個區間:pretty(x, n)
二,類型判斷和轉換
判斷 | 轉換 |
is.numeric(x) | as.numeric(x) |
is.character(x) | as.character(x) |
is.vector(x) | as.vector(x) |
is.matrix(x) | as.matrix(x) |
is.data.frame(x) | as.data.frame(x) |
is.factor(x) | as.factor(x) |
is.logical(x) | as.logical(x) |
三,隨機抽樣
從海量的數據抽取一定數量的樣本數據,以創建分析模型,抽樣的函數是:
sample(x, size, replace = FALSE, prob = NULL)
參數註釋:
- x:樣本空間
- size:抽取的樣本數量
- replace:如果為TRUE,表示放回抽樣;如果為FALSE,表示無放回抽樣;
舉個例子,采用放回抽樣,把樣本重復12次,得到一個矩陣,並轉換為數據框類型:
> d <-data.frame(matrix(sample(c(NA, 1:4), 12, replace = TRUE), 4)) > d X1 X2 X3 NA 4 1 1 2 NA 1 4 2 NA NA 4
四,偽隨機數
函數runif()用於生成服從正態分布的偽隨機數,n是生成隨機數的個數,min和max是隨機數的最值。
runif(n, min = 0, max = 1)
在每次生成隨機數時,函數都會使用一個不同的種子,因此會產生不同的結果,通過函數set.seed(n)顯式指定種子,讓結果可以重現。
舉個例子,設置隨機數種子,使用runif()函數生成0-1區間上服從均勻分布的偽隨機數:
set.seed(n) runif(5)
設置R會話的小數點數量,生成整數偽隨機數:
> options(digits=0) > set.seed(1) > runif(10,min=1,max=100) [1] 27 38 58 91 21 90 95 66 63 7
五,控制流
常用的控制流是循環和條件執行
1,for循環結構
for循環重復執行一個語句,直到叠代變量的值不再包含序列seq中為止:
for( var in seq) {statement}
舉個例子,叠代一個序列,打印出叠代器的計算值:
for( i in 1:10) { print(i^i) }
2,條件執行
if (condition) statement if (condition) statement1 else statement2
第二個條件執行語句可以簡寫為ifelse結構:
ifelse(condition,statement1,statement2)
六,創建自定義函數
參考我的博客《R語言學習 第四篇:函數,分支和循環》
R實戰 第三篇:數據處理(基礎)