• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

R语言——四、数据读入和预处理

武飞扬头像
小趴菜_
帮助1

一、数据读入

数据读入方式:直接输入、外部数据读入

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数据分析方法与案例详解》

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggjjgc
系列文章
更多 icon
同类精品
更多 icon
继续加载