导入数据or读取文件
getwd() #显示当前的目录
#改变当前的目录也可以点最上面的Session--Set working directory--choose directory
#右下角那个files就是当前目录下的文件
#可以直接在右下角那里面点一下就可以打开,像txt文件(这个打开了在里面显示的)
x<-read.table('C:/Users/Administrator/Desktop/R/第二章txt.txt',header=T,sep='')
#第一行是数据header就是F,是名字就要T 后面那个sep看分隔符,如果是空格的话就不用打 就像这个这样
y<-read.csv('C:/Users/Administrator/Desktop/R/第二章txt.txt',header=T)
#read.csv就是少了个参数sep,但感觉还是适合txt里面是逗号的,如果是空格的就是都挤在一大列了
z<-read.delim('clipboard',header=F) #这个可以复制剪切板的但不能有中文汉字
x<-scan('C:/Users/Administrator/Desktop/R/excel_wu.txt',what = list(xm="",xb=0,sg=0),sep="")
#虽然执行不了,scan得出来的是一个列表
查看缺失值
NA是缺失值,NaN是异常数,Inf是无穷大
vx<-c(1,2,NA,6,8)
(y1<-is.na(vx))
(y2<-(complete.cases(vx)))
#就is.na和complete.cases返回的相反的,自己理解
(mx<-matrix(1:12,3))
mx[2,1]=NA;mx[2,2]=NA #注意改矩阵里的值用的是[]
mx
(y3<-is.na(mx)) #这是针对每个元素的
(y4<-complete.cases(mx)) #这是针对一行行的
#就感觉平时用的话数据多的时候可以先complete.cases再is.na
vx[y1]=10 #缺失值直接用10来填充
#这里如果用y2那除了缺失值其他的会变成10,缺失值还是缺失值
mx[y3]=10 #两个缺失值都用10来填充了
mx
install.packages(c('mice','VIM'))
library(VIM)
str(sleep) #这是研究动物睡眠的一个数据
summary(sleep) #显示了最小值,第一个四分位点,中位数,均值,第三个四分位点,最大值,还有时候会有NA的个数
sum(is.na(sleep$Dream))#除了summary看缺失值个数,也可以用sum来计算数出某列的缺失值个数
apply(is.na(sleep),2,sum) #第一章最后的apply家族,2是列的维度,1是行的维度,就理解为每列TRUE=1再求和
library(mice)
md.pattern(sleep) #这个就是mice里面的函数md.pattern
#得出的结果是结合第一列和最后一列来看的 第一行是名字,最后一行是汇总,第一列是同一模式(缺失值的位置一样)的个数,最后一列的数字是该行缺失值的个数
library(VIM)
aggr(sleep,prop=F,number=T) #也是VIM里面的函数,就画出了一个图,自己看结合上面这个md.pattern
matrixplot(sleep) #VIM里面的函数,红色是缺失值,黑色越深数越大
处理缺失值
ps就替换缺失值感觉还是is.na好用点
1、按行删除
library(mice)
md.pattern(sleep) #这个就是mice里面的函数md.pattern
#得出的结果是结合第一列和最后一列来看的 第一行是名字,最后一行是汇总,第一列是同一模式(缺失值的位置一样)的个数,最后一列的数字是该行缺失值的个数
newsleep<-na.omit(sleep) #这是按行来删除,就上42行是没有缺失值的,下面的全删了
str(newsleep) #查看他的结构
md.pattern(newsleep) #就继续看他的格式啥的
2、配对删除
cor(sleep,use="pairwise.complete.obs") #计算相关系数矩阵,
#但配对删除,就总的有62条,有些缺失值是12有些是14删掉了进行计算相关系数的总的数据的个数就不一样多了,可能会出问题
3、替换缺失值
#用均值替换缺失值
x<-c(1,2,NA,100,NA,2,4)
a<-mean(x,na.rm=T) #就把缺失值去掉去计算均值了,五个数除以五
a
x[is.na(x)]<-a
x
#此外还可以用中位数去换,就把mean改成median
#此外,还有种处理方法,就是两行或两列的相关系数很就接近1,像数学和化学,少了一个数学的值,但是有化学的值,你就可以用化学的值用相关系数还是什么回归方程去计算出数学的值
数据转换 就按比例进行缩放
①极差化,就一串数字,那个数变成了=(每一个数-min)/(max-min)
②标准化scale 一串数字有平均值mean和方差sd就每一个数字'=(每一个数-mean)/sd 也叫z分数,这个的得到的值叫z
③小数定标规范化 emmmm 移动小数点,全部变成小于1的数字......
数据框根据某列顺序进行排序
str(airquality) #airquality也是R自带的数据
airquality=airquality[order(airquality$Temp),] #排序 按照Temp进行排序,注意后面的逗号
head(airquality,5) #查看airquality的前五行
tail(airquality,5) #和后五行
查看分位点
quantile(airquality$Temp,prob=c(0,0.3,0.6,1)) #quantile就查看分位点
添加新的列&对列进行处理(数据框)
airquality$isHot<-ifelse(airquality$Temp>80,T,F)#向数据框中加入新的列,如果大于80就是T,反之F
airquality=within(airquality,{TempL=NA
TempL[Temp>80]='hot'
TempL[Temp>70&Temp<=80]='warm'
TempL[Temp<=70]='cold'
})
#加了TempL这列
head(airquality,5) #查看airquality的前五行
tail(airquality,5) #和后五行
airquality$TempL<factor(airquality$TempL,levels=c('cold','warm','hot'),ordered=TRUE)
airquality$TempL
unclass(airquality$TempL) #用来查看因子变量的数值
#又增加了LTempL1这一列
airquality=within(airquality,{
TempL1=cut(Temp,breaks=c(56,74,81,97),include.lowest=T) #=T才包含最小值,不然F就变成了NA那个56的的那行的TempL1
}) #breaks就按照分位点给的数进行分位,但cut很笨,小于56和大于97的数就都变成了NA
head(airquality,5) #查看airquality的前五行
tail(airquality,5) #和后五行
#又增加了TempL2这一列
airquality=within(airquality,{
TempL2=cut(Temp,breaks=quantile(Temp,probs=c(0,0.3,0.7,1.0)),include.lowest=T)
})
table(airquality$TempL2) #这个是直接看区间来看的频数
prop.table(table(airquality$TempL2)) #这个是转化为百分比来看的
library(Hmisc)
airquality=within(airquality,{
TempL3=cut2(Temp,g=4)
}) #这个就是着借用到了Hmisc包里面的cut2,g就是分为几个部分
head(airquality,5) #查看airquality的前五行
tail(airquality,5) #和后五行
挑选其中的指定内容
subset(airquality,Month %in% c(7,9)) #就挑选出了Month是7和9的数,注意in的用法是%in%
subset(airquality,Month %in% c(7,9) & Day %in% 10:15) #&是和
subset(airquality,Month %in% c(7,9) & Day %in% 10:15 | Temp>80) #|是或
str(airquality)
str(subset(airquality,Month %in% c(7,9)))
str(subset(airquality,Month %in% c(7,9) & Day %in% 10:15))
str(subset(airquality,Month %in% c(7,9) & Day %in% 10:15 | Temp>80) )
#后面这些str是用来查看一下他们的区别的:他们挑选出来的数据的个数不一样的
subset(airquality,Month %in% c(7,9) & Day %in% 10:15 | Temp>80,select=c(Month,Day,Temp))
subset(airquality,Month %in% c(7,9) & Day %in% 10:15 | Temp>80,select=Temp:Day)
#select就挑选出了他后面()里的内容
抽样
x=sample(1:nrow(airquality),size=10,replace=T) #nrow(airquality)就是取出了这个的行数,size=10取了10个,replace=T有放回的抽样
x #x是行数
airSam=airquality[x,]
airSam
set.seed(10) #随机种子 但也没那么随机 就一般随机,执行两次抽2次都是一样的
x1=runif(10,10,100)
x2=runif(10,10,100)
x1
x2
sqldf
好像是sql语言,要另外学
library(sqldf)
newdf=sqldf('select*from airquality where Ozone>30') #确实挺方便的
newdf
newdf=sqldf('select Month,avg(Temp)as avTemp,count(*) as rCnt from airquality where Month in (7,9) group by Month')
#取了7月和9月,取了温度的平均值....rCnt不知道
newdf