title: "R數(shù)據(jù)實戰(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ù)表達式
運算符 | 描述 |
---|---|
求冪 | ^或者** |
求余 | 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 變量的重編碼
邏輯表達式
運算符 | 描述 |
---|---|
!= | 不等于 |
!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()檢測缺失值是否存在。
is.na(leadship)
- 類似缺失值的標(biāo)記與檢測
標(biāo)記 | 含義 | 檢測 | 備注 |
---|---|---|---|
NA | 缺失值 | is.na() | |
Inf | 正無窮 | is.infinite() | 5/0返回Inf |
-Inf | 負無窮 | is.infinite() | |
NaN | 不可能的值 | is.nan() | sin(Inf)不是一個數(shù) |
- 在分析中排除缺失值
- 很多數(shù)值函數(shù)都有na.rm=TRUE選項荤胁,可以在計算之移除缺失值瞧预,并用剩余值計算。
- 通過函數(shù)na.omit()移除所有含有缺失值的觀測仅政。
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 日期值
日期格式
符號 | 含義 | 示例 |
---|---|---|
%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 |
- 日期的默認輸入格式為:yyyy-mm-dd
- 按指定格式讀裙赣汀:as.Date(object, "myfomats")
- 按指定格式輸出:format(object, format="output_format")
- 日期值可以執(zhí)行算術(shù)運算。
- 函數(shù)difftime()可以計算以星期圆丹、天滩愁、時、分和秒表示的時間間隔辫封,默認為天硝枉。
- 日期型轉(zhuǎn)換成字符型:as.character()
#默認輸入格式
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ù)運算
startdate <- as.Date("1979-10-22")
enddate <- Sys.Date()
days <- enddate-startdate
days
#計算時間間隔
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ù)對數(shù)據(jù)框進行排序。默認為升序倦微。
- 在排序變量前加一個負號妻味,就變?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() | 通過一個或多個共有變量聯(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)生成一個包含所有變量名的字符型向量璃诀。
# %in%返回一個邏輯型向量弧可,匹配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 選擇觀測
- 方法1:利用行下標(biāo)
newdatas <- leadship[1:3, ]
- 方法2:利用邏輯判斷篩選
attach(leadship)
newdats <- leadship[gender == "M" & age>30]
detach(leadship)
4.10.4 subset()函數(shù)同時選擇變量和觀測
newdata3 <- subset(leadship, age>30, select=c(q1,q2,q3))
newdata4 <- subset(leadship, age>30 & gender=="M", select=q1:q4) #支持from:to冒號運算符
print(list(newdata3, newdata4))
4.10.5 隨機抽樣
#第一個參數(shù)1:nrow(leadship)確定被抽樣的總體
#第二個參數(shù)3確定抽樣規(guī)模
#第三個參數(shù)replace=FALSE表示無放回抽樣裁良。
mysample <- leadship[sample(1:nrow(leadship), 3, replace=FALSE)]
mysample
#更復(fù)雜的抽樣工具參見sampling包和survey包。