R语言机器学习入门——05

308 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

读写R格式文件

R提供了两种存储的方式,一种时候 .Rds文件,一种是Rdata文件

Rdata文件类似于工程文件,会存储所有导入的数据集和处理的数据

Rdse文件是保存数据集的文件,比如iris数据

<1>使用saveRds命令可以将数据集保存为Rds格式

将readRds赋值给一个变量x,可以完成对Rds文件的读取。

<2>使用load()函数可以直接打开Rdata文件。

数据转换(一)

#首先,使用openxlsx包中的read.xlsx()函数打开mtcars.xlsx文件

 read.xlsx('mtcars.xlsx',sheet = 1,startRow = 1)

#将其赋值为car32变量

car32 <- read.xlsx('mtcars.xlsx',sheet = 1,startRow = 1)

可以使用is.data.frame()判断是否为数据框

 is.data.frame(car32)

结果是ture,说明数据是数据框

is.data.frame()函数还可以将数据转换为数据框格式

unlist()可以用于转化成列表

as.factor、as.vector可以用来转化成因子和向量。

数据转换(二)

如何对数据取子集?

可以使用索引的方式:

who <- read.csv("WHO.csv",header = T)

取该数据集的前50行,10列

who1 <- who[c(1:50),c(1:10)]

也可以不连续的提取,取该数据集的1,3,5,8行,2,14,18列:

who2 <- who[c(1,3,5,8),c(2,14,18)]

还可以使用逻辑值来进行筛选,比如使用which函数取出who数据集中continent列的值等于7的数据集合:

who3 <- who[which(who$Continent==7),]

还可以使用逻辑值的设置范围进行取值:

who4 <- who[which(who$CountryID>50 &who$CountryID<=100),]

取出who数据集中CountryID列的值在50到100之间的数据集合

可以直接使用subset()函数进行子集的提取

 who4 <- subset(who,who$CountryID>50 &who$CountryID<=100)

在R中可以使用sample函数进行随机抽样

x <- 1:100
(设置一个x样本,数据范围在1100sample(x,30)
(随机取x中的30个样本)
sample(x,30,replace = T)
(随机取x中的30个样本,但是是有放回的抽样,也就是说样本中可以有重复数字出现)

sample函数用于数据框时,如下

who[sample(who$CountryID,30,replace =F),]

随机取出了一个子集

如何删除固定行?最简单的就是使用负索引的方式,如下

mtcars[-1:-5,]  删除对应的列,逗号在前,删除对应的行
将列的值赋值给NULL,相当于清空该列的值
mtcars$mpg <- NULL

数据框如何进行添加与合并?

最简单的方法是使用data.frame()直接生成一个新的数据框

 data.frame(USArrests,state.division)
如果单纯的想添加一列,可以用cbind函数
cbind(USArrests,state.division)
直接在数据后面添加一列state.division的数据
但是添加行不容易,因为使用Rbind()必须两者的列名是一样的,下面进行一个示范:
data1 <- head(USArrests,20) 取出前20行数据
data2 <- tail(USArrests,20) 取出后20行数据
rbind(data1,data2) 将两个行合并
在使用cbind和rbind的时候,数据必须有相同的行数和列数

如果数据集中有重复的数据应该如何处理呢?

假设取一个50个数据量的数据集的两个子集,容量分别为30,重复的数据有10
data1 <- head(USArrests,30)
data2 <- tail(USArrests,30)
使用rbind合并
data4 <- rbind(data1,data2)
使用duplicated(data4)判断哪些是重复值,取出重复值:
data4[duplicated(data4),]
加感叹号取出非重复的部分 (感叹号是取反的意思)
data4[!duplicated(data4),]
可以使用unique()函数一步完成非重复部分的提取
unique(data4)

数据转换(三)

数据框的翻转

使用t()函数可以实现数据框的转置,行转成列。列转成行
sractm <- t(mtcars)


翻转单独一行
可以使用rev()函数
rev(row.names(women))
women[rev(row.names(women)),]

先试用rev()函数翻转利用row.names()函数取得的行名,然后再将翻转后的行名作为索引,取出该行就行

如何修改数据框的值

比如将women数据框中的height列数据的值的单位由英寸转化成厘米

women$height*2.54
data.frame(women$height*2.54,women$weight)

先取出这一列,让数值全部乘以换算值,之后使用data.frame()函数重新组合成一个数据框

但这种方法并不高效

<1>可以使用transform()函数

transform(women,height=height*2.54)

<2>如果不想更改原来的数据,也可以直接用transform增加一列

transform(women,cm=height*2.54)

如何对数据框进行排序

Sort()对向量进行排序,返回的是排序后的结果向量,rev(sort())则是按照相反的顺序进行排序

Order()也可以对向量进行排序,但返回的是向量所在的位置,也即是向量中 元素的索引

如果想按照某一行的元素的大小顺序进行排序,利用order的话可以这样写:
order(mtcars$cyl)
mtcars[order(mtcars$cyl),]
如果想取相反的顺序,直接在数据前添加一个负号即可
mtcars[order(-mtcars$cyl),]
还可以进行多重条件下的排序
mtcars[order(mtcars$mpg,mtcars$disp),]