title: "R數(shù)據(jù)實(shí)戰(zhàn)4:基本數(shù)據(jù)管理"
author: "wintryheart"
date: "2019年5月17日"
output:
html_document:
toc: TRUE
knitr::opts_chunk$set(echo = TRUE)
第4章 基本數(shù)據(jù)管理
4.1 數(shù)據(jù)集
manager <- c(1:5)
date <- c("10/24/08", "10/28/08", "10/1/08","10/12/08","5/1/09")
country <- c("US", "US","UK","UK","UK")
gender <- c("M","F","M","F","M")
age <- c(32,45,25,39,99)
q1 <- c(5,3,3,3,2)
q2 <- c(4,5,5,3,2)
q3 <- c(5,2,5,4,1)
q4 <- c(5,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
leadship <- data.frame(manager, date, country, gender, age, q1, q2, q3,q4,q5, stringsAsFactors = FALSE)
leadship
4.2 創(chuàng)建新變量
算術(shù)表達(dá)式
| 運(yùn)算符 | 描述 |
|---|---|
| 求冪 | ^或者** |
| 求余 | x%%y |
| 整除 | x%/%y |
#第一種方式:利用attach()簡化操作
attach(leadship)
leadship$sumq12 = q1+q2
leadship$meanq12 = (q1+q2)/2
detach(leadship)
#第二方式:利用transform()函數(shù)
leadship <- transform(leadship,
sumq123 = q1+q2+q3,
meanq123 = (q1+q2+q3)/3)
leadship
4.3 變量的重編碼
邏輯表達(dá)式
| 運(yùn)算符 | 描述 |
|---|---|
| != | 不等于 |
| !x | 非X |
| x | y | x或y |
| x & y | x和y |
| isTRUE(x) | x是否為TRUE |
# within()和with()的不同之處在于,within()允許修改數(shù)據(jù)框。
leadship$age[leadship$age == 99] <- NA #將99歲的年齡值編碼為缺失值。
leadship <- within(leadship,{
agecat <- NA #創(chuàng)建新變量,賦值為缺失值
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <=75] <- "Middle Aged"
agecat[age <55] <-"Yong"})
leadship
# 利用car包中的recode()函數(shù),和doBy包中的recodevar()函數(shù)更為方便。
4.4 變量重命名
手工修改:fix()函數(shù)調(diào)出交互式操作框
fix(leadship)
笨辦法: names()函數(shù)
names(leadship)[2] <- "textDate"
更好用的方法:plyr包中的rename()函數(shù)
rename(dataframe, c(oldname1="newname1", oldname2="newname2", ... ))
library(plyr)
leadship <- rename(leadship, c(q1="item1", q2="item2",q3="item3",q4="item4",q5="item5"))
leadship
4.5 缺失值
is.na()檢測(cè)缺失值是否存在。
is.na(leadship)
- 類似缺失值的標(biāo)記與檢測(cè)
| 標(biāo)記 | 含義 | 檢測(cè) | 備注 |
|---|---|---|---|
| NA | 缺失值 | is.na() | |
| Inf | 正無窮 | is.infinite() | 5/0返回Inf |
| -Inf | 負(fù)無窮 | is.infinite() | |
| NaN | 不可能的值 | is.nan() | sin(Inf)不是一個(gè)數(shù) |
- 在分析中排除缺失值
- 很多數(shù)值函數(shù)都有na.rm=TRUE選項(xiàng),可以在計(jì)算之移除缺失值,并用剩余值計(jì)算。
- 通過函數(shù)na.omit()移除所有含有缺失值的觀測(cè)。
x <- c(1, 2, NA, 3)
y <- sum(x)
z <- sum(x, na.rm=TRUE)
print(list(x=x, y=y, z=z))
newdata <- na.omit(leadship)
newdata
4.6 日期值
日期格式
| 符號(hào) | 含義 | 示例 |
|---|---|---|
| %d | 數(shù)字表示的日期(0~31) | 01-31 |
| %a | 縮寫的星期名 | Mon |
| %A | 非縮寫的星期名 | Monday |
| %m | 數(shù)字表示的月份(01~12) | 01 |
| %b | 縮寫的月份 | Jan |
| %B | 非縮寫的月份 | January |
| %y | 兩位數(shù)的年份 | 07 |
| %Y | 四位數(shù)的年份 | 2007 |
- 日期的默認(rèn)輸入格式為:yyyy-mm-dd
- 按指定格式讀?。篴s.Date(object, "myfomats")
- 按指定格式輸出:format(object, format="output_format")
- 日期值可以執(zhí)行算術(shù)運(yùn)算。
- 函數(shù)difftime()可以計(jì)算以星期、天、時(shí)、分和秒表示的時(shí)間間隔,默認(rèn)為天。
- 日期型轉(zhuǎn)換成字符型:as.character()
#默認(rèn)輸入格式
mydates1 <- as.Date(c("2007-01-09", "2019-03-14"))
#按指定格式讀取
strDates <- c("01/15/1965","05/12/1970")
mydates2 <- as.Date(strDates, "%m/%D/%Y")
#按指定的格式輸出
Sys.Date()
date()
today <- Sys.Date()
format(today, format="%B %d日 %Y年")
format(today, format="%A")
#日期算術(shù)運(yùn)算
startdate <- as.Date("1979-10-22")
enddate <- Sys.Date()
days <- enddate-startdate
days
#計(jì)算時(shí)間間隔
difftime(enddate, startdate)
difftime(enddate, startdate, units="weeks")
4.7 類型轉(zhuǎn)換
類型轉(zhuǎn)換函數(shù)
| 判斷 | 轉(zhuǎn)換 |
|---|---|
| is.numeric() | as.numeric() |
| is.character() | as.character() |
| is.vector() | as.vector() |
| is.matrix() | as.matrix() |
| is.data.frame() | as.data.frame() |
| is.factor() | as.factor() |
| is.logical() | as.logical() |
4.8 數(shù)據(jù)排序
- 使用order()函數(shù)對(duì)數(shù)據(jù)框進(jìn)行排序。默認(rèn)為升序。
- 在排序變量前加一個(gè)負(fù)號(hào),就變?yōu)榻敌颉?/li>
attach(leadship)
newdata1 <- leadship[order(gender,age),]
newdata2 <- leadship[order(gender, -age),]
print(list(newdata1, newdata2)) #NA比數(shù)字大。
detach(leadship)
4.9 數(shù)據(jù)集合并
| 合并方向 | 函數(shù) | 說明 |
|---|---|---|
| 添加列 | merge() | 通過一個(gè)或多個(gè)共有變量聯(lián)結(jié),by="共有變量" |
| 添加列 | cbind() | 沒有共有變量 |
| 添加行 | rbind() |
4.10 數(shù)據(jù)集取子集
4.10.1 保留變量
myvars <- c("q1","q2","q3","q4","q5")
或者
myvars <- paste("q", 1:5, sep="")
newdatas <- leadship[myvars]
4.10.2 剔除變量
使用邏輯判斷
# names(leadship)生成一個(gè)包含所有變量名的字符型向量。
# %in%返回一個(gè)邏輯型向量,匹配c()中元素的值為TRUE,否則為FASLE。
myvars <- names(leadship) %in% c("sumq12", "meanq12")
# !myvars 反向邏輯判斷。
# sumq12和meanq12被剔除
newdata <- leadship[!myvars]
newdata
# 通過設(shè)為未定義(NULL)來剔除變量
newdata$sumq123 <- newdata$meanq123 <- NULL
newdata
4.10.3 選擇觀測(cè)
- 方法1:利用行下標(biāo)
newdatas <- leadship[1:3, ]
- 方法2:利用邏輯判斷篩選
attach(leadship)
newdats <- leadship[gender == "M" & age>30]
detach(leadship)
4.10.4 subset()函數(shù)同時(shí)選擇變量和觀測(cè)
newdata3 <- subset(leadship, age>30, select=c(q1,q2,q3))
newdata4 <- subset(leadship, age>30 & gender=="M", select=q1:q4) #支持from:to冒號(hào)運(yùn)算符
print(list(newdata3, newdata4))
4.10.5 隨機(jī)抽樣
#第一個(gè)參數(shù)1:nrow(leadship)確定被抽樣的總體
#第二個(gè)參數(shù)3確定抽樣規(guī)模
#第三個(gè)參數(shù)replace=FALSE表示無放回抽樣。
mysample <- leadship[sample(1:nrow(leadship), 3, replace=FALSE)]
mysample
#更復(fù)雜的抽樣工具參見sampling包和survey包。