title: "R数据实战4:基本数据管理"
author: "wintryheart"
date: "2019年5月17日"
output:
html_document:
toc: TRUE
knitr::opts_chunk$set(echo = TRUE)
第4章 基本数据管理
4.1 数据集
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 创建新变量
算术表达式
运算符 | 描述 |
---|---|
求幂 | ^或者** |
求余 | x%%y |
整除 | x%/%y |
#第一种方式:利用attach()简化操作
attach(leadship)
leadship$sumq12 = q1+q2
leadship$meanq12 = (q1+q2)/2
detach(leadship)
#第二方式:利用transform()函数
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()允许修改数据框。
leadship$age[leadship$age == 99] <- NA #将99岁的年龄值编码为缺失值。
leadship <- within(leadship,{
agecat <- NA #创建新变量,赋值为缺失值
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <=75] <- "Middle Aged"
agecat[age <55] <-"Yong"})
leadship
# 利用car包中的recode()函数,和doBy包中的recodevar()函数更为方便。
4.4 变量重命名
手工修改:fix()函数调出交互式操作框
fix(leadship)
笨办法: names()函数
names(leadship)[2] <- "textDate"
更好用的方法:plyr包中的rename()函数
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)
- 类似缺失值的标记与检测
标记 | 含义 | 检测 | 备注 |
---|---|---|---|
NA | 缺失值 | is.na() | |
Inf | 正无穷 | is.infinite() | 5/0返回Inf |
-Inf | 负无穷 | is.infinite() | |
NaN | 不可能的值 | is.nan() | sin(Inf)不是一个数 |
- 在分析中排除缺失值
- 很多数值函数都有na.rm=TRUE选项,可以在计算之移除缺失值,并用剩余值计算。
- 通过函数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 | 数字表示的日期(0~31) | 01-31 |
%a | 缩写的星期名 | Mon |
%A | 非缩写的星期名 | Monday |
%m | 数字表示的月份(01~12) | 01 |
%b | 缩写的月份 | Jan |
%B | 非缩写的月份 | January |
%y | 两位数的年份 | 07 |
%Y | 四位数的年份 | 2007 |
- 日期的默认输入格式为:yyyy-mm-dd
- 按指定格式读取:as.Date(object, "myfomats")
- 按指定格式输出:format(object, format="output_format")
- 日期值可以执行算术运算。
- 函数difftime()可以计算以星期、天、时、分和秒表示的时间间隔,默认为天。
- 日期型转换成字符型: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")
#日期算术运算
startdate <- as.Date("1979-10-22")
enddate <- Sys.Date()
days <- enddate-startdate
days
#计算时间间隔
difftime(enddate, startdate)
difftime(enddate, startdate, units="weeks")
4.7 类型转换
类型转换函数
判断 | 转换 |
---|---|
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 数据排序
- 使用order()函数对数据框进行排序。默认为升序。
- 在排序变量前加一个负号,就变为降序。
attach(leadship)
newdata1 <- leadship[order(gender,age),]
newdata2 <- leadship[order(gender, -age),]
print(list(newdata1, newdata2)) #NA比数字大。
detach(leadship)
4.9 数据集合并
合并方向 | 函数 | 说明 |
---|---|---|
添加列 | merge() | 通过一个或多个共有变量联结,by="共有变量" |
添加列 | cbind() | 没有共有变量 |
添加行 | rbind() |
4.10 数据集取子集
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
# 通过设为未定义(NULL)来剔除变量
newdata$sumq123 <- newdata$meanq123 <- NULL
newdata
4.10.3 选择观测
- 方法1:利用行下标
newdatas <- leadship[1:3, ]
- 方法2:利用逻辑判断筛选
attach(leadship)
newdats <- leadship[gender == "M" & age>30]
detach(leadship)
4.10.4 subset()函数同时选择变量和观测
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 随机抽样
#第一个参数1:nrow(leadship)确定被抽样的总体
#第二个参数3确定抽样规模
#第三个参数replace=FALSE表示无放回抽样。
mysample <- leadship[sample(1:nrow(leadship), 3, replace=FALSE)]
mysample
#更复杂的抽样工具参见sampling包和survey包。
网友评论