开启掘金成长之旅!这是我参与「掘金日新计划 · 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样本,数据范围在1到100)
sample(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),]