文章目录
提示:以下是本篇文章正文内容,下面案例可供参考,以下纯属学习笔记。其中借助到了许多资料。书籍。
一、数据读入
数据读入方式:直接输入、外部数据读入
1.直接输入数据
c()函数方式输入
x=c(1,2,3,4) #数据之间要用逗号隔开
x
y=c("a","b","c")
y
scan()函数输入数据
先安装scan包
install.packages("scan")
2.读R包中的数据
2.1查看当前环境下的数据:ls()函数
ls()
2.2删除数据: rm()函数
2.3查看所有预先提供的数据:data()
2.4查看某个包所有预先提供的数据:data(package=‘’)
2.5读入数据:data(datasetname)
2.6查看SemiPar包中的数据
install.packages(SemiPar)
data(package=“SemiPar”)
读入SemiPar包中的copper数据
data(copper,package='SemiPar')
copper
如果一个软件包已经被library附加在库中,
则这个数据库将自动被包含在其中,例如:
library(SemiPar)
data()
data(fossil)#读取SemiPar数据库中的fossil(化石)数据
fossil
3.从外部文件读入数据
3.1 读入文本文件(TXT)
格式一:
read.table(file, header = logical_value, sep = " ", row.names ='name' )
file 是一个带分隔符的ASCII文本文件
header 为逻辑值,表明首行是否包含了变量名,
默认值为FALSE(即是数据框的列名为V1,V2,…),设置为TURE时第一行作为列名。
sep 用于指定分隔符,默认为空格,也可以设置为逗号或分号:sep=‘,‘或 sep=’;’。
row.names 指定行的名称
格式二:
选择需要读入的数据复制,然后执行下面的命令:
s2 = read.table("clipboard",header=T)
s2
3.2读入Excel格式文件
R可以直接读入Excel中的数据(xls、xlsx格式的数据),但这种格式较为复杂,应尽量避免。
如果要直接读入xls、xlsx等格式的数据,需要安装readxl包。
通常的做法是先将xls、xlsx等格式的文件转换为csv格式文件
转换方式:在excel中另存为csv格式即可。
读入csv格式的文件数据:
read.csv(file, header = TRUE, sep = ",")
S2=read.csv(file="student.csv")
S2
3.3读入其它格式文件(SAS数据、SPSS数据、Stata数据等)
R读入其它格式的数据,需要安装“foreign”包
install.packages("foreign")
library(foreign)
读入SAS数据格式:
read.xport("dataname.xpt") #读入SAS格式文件
读入SPSS数据格式:
read.spss("dataname.sav")
读入Stata数据格式:
read.dta("dataname.dta")
当读入数据文件后,使用 数据集名$变量名 ,就可以使用各个变量
二、写入数据
如果需要存储R工作空间中的数据时,可以利用write()函数,格式:
write(x, file = "data",
ncolumns = if(is.character(x)) 1 else 5,
append = FALSE, sep = " ")
x 是数据,通常为矩阵、向量
file 是文件名,默认为data
append=TRUE,表示在原文件上添加数据,否则写一个新文件(默认)
ncolumns 是写入数据的列数
对于列表数据或数据库数据,
也可以使用write.table()函数,写入纯文本格式数据;
或write.csv()函数,写入csv格式的excel数据文件;
write.table(x, file = "", append = FALSE, sep = " ")
write.csv(...)
write.csv2(...)
例1:将前面的S2数据写到当前工作目录下,命名为S2.txt的文件里。
write.table(S2,“S2.txt”)
例2:将前面的S2数据写到D:\R\data\目录下,命名为S2.csv的文件里
write.csv(S2, “D:\R\data\S2.csv”)
三、数据预处理
收集到的数据,由于各种原因(如市场调查中的无回答,输入错误等),
导致源数据的各种问题,如数据缺失、异常点的出现等。
在对数据进行分析之前,需要对这些源数据进行预处理。
例:R中的VIM包中,关于哺乳动物的睡眠数据(sleep)
install.packages(VIM)
library(VIM)
data(sleep,package="VIM")
sleep
在sleep数据中存在以下一些实际问题:
(1)存在许多缺失值(NA),该如何弥补这些缺失值带来的分析困难?
(2)如何构造一个新变量(如:直接列出做梦时长占全部睡眠时间的比例),或如何改变某个变量的值?
(3)如何更改变量名称(如:NonD这个变量名难以理解,想更改为一个更直观的变量名称)?
(4)在sleep中的Pred、Exp、Danger录入时均为数值型变量,如何变为因子型变量?
(5)如何合并、提取数据?
1.创建新变量
有时,需要对现有的一个或几个变量进行变换,创建一个新的变量。
方法一:左边为变量名,右边为其它变量的表达式:
方法二:用transform()函数进行变换
方法三:用with()函数进行变换
例如:有五个省份的GNP、消费(cons)和人口(pop)的数据如下:
cons<-c(5000,5800,6000,10200,8500)
cons
pop<-c(2000,3600,3500,5020,6100)
pop
gnp<-c(6000,7200,7400,11000,9200)
gnp
现在需要得到人均GNP和人均储蓄的指标数据
方法一:左边为变量名,右边为其它变量的表达式
pgnp<-gnp/pop
pgnp
psave<-(gnp-cons)/pop
psave
方法二:用transform()函数进行变换
data<-data.frame(gnp,cons,pop)#定义一个数据框
data
transform(data,pgnp=gnp/pop,psave=(gnp-cons)/pop)
方法三:用with()函数进行变换
格式: with(data,expr,),表示对data执行expr运算。
(pgnp<-with(data,gnp/pop))
(psave<-with(data,(gnp-cons)/pop))
2.变量重编码
变量重编码是数据预处理中常见的问题,比如:
将连续型变量进行分组,变成一个离散型变量
将某个值替换成另外一个值
例如:以MASS包中的Cars93数据为例,
该数据是关于不同汽车制造商不同款式的汽车价格等数据,共27个变量
现在我们关心的是:“制造商和价格”两个变量
install.packages(MASS)
library(MASS)
data(Cars93)
head(Cars93)
dat<-data.frame(manu=Cars93$Manufacturer,price=Cars93$Price)
head(dat)
由于价格的数据是连续型数值变量,
现在想将价格按照(0,12)、(12,20)、(20,max(price))
分成"cheap"、“okay”、“expensive"三种类型
方法一:利用[]将price分成不同的取值区间,然后用"cheap”、“okay”、"expensive"分别进行替换。
dat$pricegrade<-NA #dat中增加一列,赋值为NA
dat
dat$pricegrade[dat$price>=20]<-"expensive"
dat$pricegrade[dat$price>=12&dat$price<20]<-"okay"
dat$pricegrade[dat$price<12]<-"cheap"
head(dat)
方法二:使用within(data,expr)函数,表示对data执行expr运算
该函数与with()函数用法类似,不同的是该函数可以对数据框进行修改
dat<-within(dat,{
pricegrade<-NA
pricegrade[price>=20]<-"expensive"
pricegrade[price>=12&dat$price<20]<-"okay"
pricegrade[price<12]<-"cheap"
})
head(dat)
方法三:利用cut()函数先将连续取值的price分成三个区间,
然后再用levels()函数将不同的区间用"cheap"、“okay”、"expensive"分别进行命名。
dat$pricegrade<-cut(dat$price,c(0,12,20,max(dat$price)))
#对价格price分成三个区间
levels(dat$pricegrade)<-c("cheap","okay","expensive")
head(dat)
如果我们需要进一步对上面的"cheap"、“okay”、"expensive"三种类型分别替换为“A”、“B”、“C”
可以利用car包中的recode()函数
install.packages(car)
library(car)
recode(dat$pricegrade,"'cheap'='A';'okay'='B';'expensive'='C'")
3.变量重命名
方法一:使用交互式编辑器
在命令窗口输入fix(data),R会自动调用一个交互式的编辑器,单击变量名,
在弹出的对话框中就可以将其重命名。
library(MASS)
data(Cars93)
head(Cars93)
dat<-data.frame(manu=Cars93$Manufacturer,price=Cars93$Price)
head(dat)
dat$pricegrade<-cut(dat$price,c(0,12,20,max(dat$price)))
levels(dat$pricegrade)<-c("cheap","okay","expensive")
head(dat)
fix(dat)
方法二:利用reshape包中的rename()函数,格式:
rename(dataframe, c(oldname1='newname1',oldname2='newname2',...))
例:将数据框dat中的pricegrade重命名为grade.
install.packages(reshape)
library(reshape)
dat1 <- rename(dat, c(pricegrade="grade"))
head(dat1)
方法三:直接通过names()函数重命名。
names(dat)
names(dat)[3] <- "grade"
head(dat)
4.变量类型的转换
4.1 is.datatype(): 判断数据的类型,返回TRUE或者FALSE
4.2 as.datatype(): 将其参数转换为对应的数据类型
4.3 is.numeric(),判断括号里面的参数是否为数值型数据
4.4 is.character(),判断括号里面的参数是否为字符型数据
4.5 is.logical(),判断括号里面的参数是否为逻辑型数据
4.6 is.complex(),判断括号里面的参数是否为复数型数据
4.7 is.na(),判断括号里面的参数是否为缺失值
4.8 as.numeric(),将括号里面的参数转换为数值型数据
以上数据类型前面改为as,表示将括号里面的数据转换为相应类型数据
判断/转换数据结构也是类似的,如:
4.9 is.vector(), 判断是否为向量结构;as.vector(),转换为向量结构
4.10 is.matrix(),判断是否为矩阵结构;as.matrix(),转换为矩阵结构
4.11 is.array(),判断是否为数组结构;as.array(),转换为数组结构
4.12 is.factor(),判断是否为因子结构;as.factor(),转换为因子结构
4.13 is.list(),判断是否为列表结构;as.list(),转换为列表结构
4.14 is.list(),判断是否为列表结构;as.list(),转换为列表结构
4.15 is.data.frame(),判断是否为数据框结构;as.data.frame(),转换为数据框结构
a <- c(1,2,3);a
is.numeric(a) #判断a是否为数值型数据
is.vector(a) #判断a是否为向量结构
a <- as.character(a);a #将a转换为字符型数据
is.numeric(a)
is.vector(a)
is.character(a)
5.日期变量的转换
转换日期变量格式的是 as.Date()函数
语法结构为:
as.Date(x, "input_format")
在字符表示法和代表日历日期的 "Date "类对象之间转换的函数。
x是字符型数据格式的日期
input_format 是用于读入日期的适当格式
常见日期格式:
%d:数字表示的日期(0131),比如:0131
%a:缩写的星期名,如:Mon
%A:非缩写的星期名,如:Monday
%m:月份(0112),如:0112
%b:缩写的月份,如:Jan
%B:非缩写的月份,如:January
%y:两位数的年份,如:22
%Y:四位数的年份,如:2022
日期的默认格式为: yyyy-mm-dd
madates <- as.Date(c("2022-04-22","2022-04-25"))
madates
将默认格式的字符型数据转换为对应日期:
(strDates <- c("04/22/2022", "04/25/2022"))
dates <- as.Date(strDates,"%m/%d/%Y")
dates
四、缺失数据处理
R中,缺失值用符号NA表示。
1.缺失数据的探索与检验
R中,可以利用is.na()函数检验是否存在缺失值
y <- c(1,2,3,NA)
is.na(y)
识别矩阵或数据框中没有缺失值的行,用complete.cases()函数。
如果每行都有完整的数据,返回TRUE;
如果每行有一个或多个缺失值,则返回FALSE.
library(VIM)
data(sleep, package= "VIM") #读取VIM包中的sleep数据
sleep
sleep[!complete.cases(sleep),] #提取sleep数据中不完整的行
由于逻辑值TRUE和FALSE分别等价于数值1和0,
所有可以利用sum()和mean()函数来获取关于缺失数据有用的信息。
计算sleep数据中完整行数占总行数(观测单元数)的比例。
mean(complete.cases(sleep))
2.缺失数据的处理
缺失数据的处理方法,通常有三种:
第一种:行删除法,利用函数na.omit()即可删除。
newsleep <- na.omit(sleep)
newsleep
第二种:均值替换法
当缺失值是数值型:利用该变量在其他所有对象的取值的平均值来填充缺失值
当缺失值是非数值型:利用该变量在其他所有对象的取值次数最多的值(众数)填充缺失值
第三种:多重插补(MI)法,是最常用的方法
思路:从一个包含缺失值的数据集中生成一组完整的数据集,
而在每个模拟的数据集中,缺失值用蒙特卡洛法填补。
这种多重估算技术并不是用单一的值来替换缺失值,而是产生缺失值的一个随机样本。
这种方法反映了由于数据缺失而导致的不确定。
R中的mice包可以执行缺失值的多重插补,代码如下:
library(mice)
imp <- mice(data,m)
mice(),表示对缺失数据进行m次估算
参数data,是一个包含不完整数据的数据框或矩阵,缺少的值被编码为NA。
m是多重插值的数量,默认值为m=5.
imp是一个包含m个插补数据集的列表对象,同时还含有完成插补过程的信息
fit <- with(imp,analysis)
with(),对已经完成的数据imp进行分析
analysis是一个表达式对象,用于设定应用于m个插补数据集的统计分析方法,
例如线性回归模型的lm()函数等。
pooled <- pool(fit)
pool(),合并参数估计值
fit 是一个包含m个单独统计分析结果的列表对象。
pooled 是一个包含这m个统计分析平均结果的列表对象。
summary(pooled)
生成摘要。
例如,利用MI方法插补sleep数据中的缺失值。
library(mice)
data(sleep, package="VIM")
sleep
imp <- mice(sleep)
fit <- with(imp,lm(Dream ~ Span + Gest))
pooled <- pool(fit)
summary(pooled)
五、数据集的合并与拆分
1.数据框的拆分与合并
有时需要对数据进行分组,再分析;
拆分数据框,用函数unstack()
有时需要对不同组的数据进行合并,再分析;
合并数据框,用函数stack()
例,以dataset的内置数据PlantGrowth(植物生长)为例进行分析:
data(PlantGrowth)
PlantGrowth
数据中包含30个样本观测值,
分为三组(ctrl,对照组;trt1,处理组1;trt2,处理组2),每组10个样本。
现在需要对PlantGrowth数据按照ctrl、trt1、trt2进行拆分:
data(PlantGrowth)
formula(PlantGrowth)#检查默认公式
unPG <- unstack(PlantGrowth)#根据默认公式进行拆分
unPG
sPG=stack(unPG)#对unPG进行重新组合
sPG
2.数据集的合并
横向合并两个数据框(数据集),使用merge()函数
横向合并两个数据框时,通常需要一个或多个共有变量进行连接(inner join).
例如:
newdata <- merge(dataframA,data.frameB,by="ID")
将数据框dataframA和data.frameB按照共有变量ID合并。
如果要直接横向合并两个矩阵或数据框,使用cbind()函数
但是必须要求两个矩阵或数据框有相同的行数,且以相同的顺序排列。
A <- matrix(1:12,3,4);A
B <- matrix(13:24,3,4);B
C <- cbind(A,B);C
3.数据集的抽取
3.1 保留变量。从一个大数据集中选择有限数量的变量创建一个新的数据集。
从dataframe中选取第n到第m个变量,及所有行的数据,保存到新的数据框newdata中。
newdata <- dataframe[,c(n:m)]
#例如,选取sleep中第3到第7列的数据,保存到新的数据框:
sleep
newdata1 <- sleep[,3:7]; newdata1
也可以直接指定选取的变量名称
vars <- c("var1","var2","var3","var4")
newdata <- data.frame[vars]
#例如
sleep
vars <- c("NonD","Dream","Sleep","Danger")
newdata2 <- sleep[vars]; newdata2
3.2 剔除变量
vars <- names(dataframe) %in% c(“var1”,“var2”)
newdata <- dataframe[!vars]
sleep
vars <- names(sleep) %in% c("BodyWgt","BrainWgt","NonD");vars
判断数据框sleep中的每个变量是否在向量c(“BodyWgt”,“BrainWgt”,“NonD”)中
newdata3 <- sleep[!vars];newdata3
选取数据框sleep中不属于vars的变量名,保存为新的数据框newdata4
当知道要剔除的变量是第几个变量时,可以利用以下命令:
newdata <- dataframe[c(-n,-m)] #表示删除第n和第m个变量
3.3 选择观测值
#选择sleep中前20个观测
newdata5 <- sleep[1:20, ];newdata5
#选择睡眠时间在3~6小时之间的观测值
attach(sleep)
newdata6 <- sleep[which(Sleep>=3 & Sleep <6),]; newdata6
detach(sleep)
3.4 subset()函数
表示返回符合条件的向量、矩阵或数据框的子集。
newdata7 <- subset(sleep, Sleep>=3 & Sleep<6, select=c(BodyWgt,Dream,Sleep,Span,Pred,Exp,Danger))
newdata7
参考教材:《R数据分析方法与案例详解》