第四章 基本数据管理
用到的数据
leadership
mydata
1.stringAsFactor=FALSE 字符不转换为因子(创建数据框选项参数)
a)如: > leadership
2.创建新变量
a)变量名
i.表达式可包含多种运算符和函数
ii.+ - * /
iii.X%%Y(求余) X%/%Y(整数除法)
b)以下得到的为独立变量
i.> sumx
ii.> meanx
c)将变量整合的原始数据框中
i.方法1
1.> mydata$sumx
2.> mydata$meanx
ii.方法2(绑定数据框,简化代码)
1.> attach(mydata)
> mydata$sumx
> mydata$meanx
> detach(mydata)
iii.方法3(使用 transform() )
1.> mydata
3.变量的重编码
a)逻辑运算符
i. >= ==(严格等于) !=(不等于) x|y(x或y) x&y(x和y)
ii.isTRUE(x) 测试x是否为TRUE
b)实例
i.将leadership中的年龄(99)替换为NA,年龄99为错误值
1.leadership$age[leadership$age == 99]
ii.将leaderhip中age(连续型变量)重新编码为类别型变量 agecat
1.“Elder”: age >= 66; “Middle Aged”: age >40 & age <66; “Young”: age >= 18 & age <=40;
2.方法1
a)> leadership$agecat[leadership$age > 66]
> leadership$agecat[leadership$age > 40 & leadership$age <66]
> leadership$agecat[leadership$age >= 18 & leadership$age <= 40]
3.方法2 使用 within()
a)> leadership
agecat[age>=66]
agecat[age>40 & age<66]
agecat[age>=18 & age<=40]
c)程序包中的变量重编码函数
i.car包中的 recode()
1.可以重编码数值型,字符型,向量或因子
ii.doBy包中的 recodevar()
iii.R中自带的 cut()
1.可以将一个数值型变量按值域切割为多个区间,并返回一个因子
4.变量的重命名
a)交互式修改,编辑器
i.fix(object)
b)编程方法
i.names()
ii.实例
> names(leadership)[2]
>names(leadership)[1:5]
leadership 第一到五列分别重名为 item1,…,item5
c)Plyr包中的 rename() 函数
i.> rename(dataframe, c(oldname=”newname”,oldname=”newname”,……))
5.缺失值 NA
a)NA (Not Avaliable) 在R中数值型和字符型缺失值都用NA表示
i.缺失值NA判断:is.na(object)
b)在R中,无限的或者不可能出现的数值不标记为缺失值NA
c)可使用赋值语句将某些值重新编码为缺失值(如将leadership中年龄99编码为缺失值)
i.正无穷大:+∞ 识别: is.infinite()
ii.负无穷大:-∞ 识别: is.infinite()
iii.不可能出现的值(如2/0):NaN 识别:is.nan()
d)na.rm=TRUE 大多数数值型函数都有此选项,移除缺失值,并使用剩余值进行计算
e)na.omit( ) 移除所有含有缺失值的观测(行),缺失值较少或较集中时使用
6.日期值
a)日期值通常以字符串(character)形式输入到R中,然后转化为以数值(numeric)形式存储的日期变量
b)as.Date() 用于执行这种转化
i.as.Date(x, “input_format”) x:字符型向量 input_format:读入日期的格式
ii.日期值的默认读入格式为:yyyy-mm-dd (如:2018-01-22)
> mydate
因为“2018-01-18”,”2018-01-22”与默认格式相同,直接读入即可
c)日期格式
符号含义实例
%d两位数表示的日期(01-31)01 - 31
%a缩写的星期名周一
%A非缩写的星期名星期一
%m两位数表示的月份(00-12)00-12
%b缩写的月份一月
%B非缩写的月份一月
%y两位数的年份18
%Y四位数的年份2018
d)实例:读入日期 “01/05/1991””12/05/1992”
i.> date
> dates
e)日期函数
i.Sys.Date() 返回当天日期 如:”2018-01-18”
ii.date() 返回系统当前时间戳 如:”Thu Jan 18 22:11:14 2018”
f)format()
i.format(x, format=”output_format”)
ii.format() 可接受一个参数,并按某种格式输出结果,可用于提取日期值中的某些成分
iii.实例
1.> today
> format(today, format=”%B%d%Y”)
[1] "一月182018"
> format(today, format=”%A”
[1] "星期四"
iv.R的内部在存储日期时,是使用自1970年1月1日以来的天数表示的,更早的日期用复数表示
1.因此日期值可以执行算术运算
2.可使用 difftime() 来计算时间间隔
a)difftime(x1, x2, units=”days”)
b)units: weeks days hour mins secs
c)实例:计算 Evan 与 HR 生日相差天数
> HR
> Evan < c(“1991-10-08”)
> difftime(HR, Evan, units=”days”)
Time difference of 447 days
7.将日期转换为字符型变量(character)
a)as.charavter()
i.> strDates
b)进行转换后,即可使用一系列字符处理函数(如:取子集,替换,联接等)
c)查看帮助: help(as.date) help(strftime)
d)日期和时间格式: help(ISOdatetime)
e)相关包: lubtidate包 timeDate包
8.数据类型转换
a)数据类型
数据符号数据类型
numeric数值
character字符(需带””)
vector向量
matrix矩阵
data.frame数据框
factor因子
logical逻辑值
b)数据类型转换函数
判断转换
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()
is.datetype()as.datetype()
返回逻辑值 TRUE或FALSE将参数转化为对应的数据类型
9.数值排序
a)order()
i.可对一个数据进行排序(默认为升序,在变量前加减号-即可得到降序结果)
ii.实例
> newdata1
> attach(leadership)
> newdata2
> newdata3
> detach(leadership)
10.数据集的合并
a)向数据框(data.frame)添加列(变量)和行(观测)的方法
b)横向合并,向数据框添加列(变量)
i.横向合并两个数据框(集),即内联结(inner join),merge()
1.merge(x1, x2, by=”c”)
2.x1 x2为数据集,”c”为公共索引(键)
3.实例
> total1
> total2
ii.直接合并两个数据框或矩阵(不需要公共索引),cbind()
1.> total
a)对象A,对象B必须拥有相同的行数
b)且对象A,对象B以同顺序排序
c)纵向合并,向数据框添加行(观测),rbind()
i.> total
ii.dataframeA dataframeB 必须拥有相同的数量
1.若dataframeA dataframeB变量不同
a)删除多余变量
b)追加变量
11.数据集取子集
a)选入(保留)变量
i.dataframe[row indices(行数), column indices(列数) ]
> newdata
> myvars
> newdata
ii.paste()字符连接函数
1.> myvars
> newdata
b)删除(丢弃)变量
i.> myvars
> newdata
# names(leadership) 生成了一个含有leadership所有变量名的字符型向量
#names(leadership) %in% c(“q3”,”q4”),返回一个逻辑型向量,names(leadership中每个匹配q3或q4的元素的值为TRUE,反正为FALSE
# !myvars 反转myvars 逻辑值
# newdata
c)选入观测(行)
i.> newdata1
ii.> newdata2 30,]
iii.> attach(leadership)
> newdata3 30, ]
>detach(leadership)
iv.限定时间
> leadership$date
> startdate
> enddate
> newdata = startdate & leadership$date <= enddate), ] #选取满足要求的日期
v.subset()
1.使用subset() 函数是选择变量和观测的简单方法
2.>newdata1=35|age<24, select=c(q1,q2,q3,q4,q5))
>newdata2 25,
select=gender:q4)
d)随机抽样
i.sample() 可以从数据集中(有放回(raplace=TRUE)或无放回(repalce=FALSE)地抽取一个大小为n的随机样本
1.> mysample
ii.sampling包:抽取和校正调查样本
iii.survery包:分析复杂调查数据
iv.自助法,重新抽样统计方法
12.使用SQL语句操作数据框
a)SQL: Structured Query Language 结构化查询语言
b)需要安装 sqldf 包: install.packages(sqldf)
i.实例1
> library(sqldf)
> newdf
row.names=TRUE) #row.names=TRUE 延用原始数据框行名
ii.实例2
> sqldf(“select avg(mpg) as avg_mpg, avg(disp) as avg_disp, gear from
mtcars where cyl in (4,6) group by gear”)