为了账号安全,请及时绑定邮箱和手机立即绑定

R语言学习笔记

标签:
Java

title: "r basical"
author: "wy"
date: "2018/7/22"
output: html_document
未完,待续...


R数据结构:

对像的5种基本属性:

  • 字符(characte)

  • 数值(numeric:real numbers)

  • 整数(integer)

  • 复数(complex):1+2i

  • 逻辑(logical:TRUE/False)

  • class( )为查看数据类型的函数

  • y <- "hallo word"表示字符型(character)

名称属性:

  • 名称 (name)

  • 维度 (dimensions:matrix,array)

  • 类型(class)

  • 长度(length)


数据结构:

  • 向量(vetocr):只能包含同一类型的对象。

创建函数的vector的方法:

x<- vector("character",length=10)       > x1<-1:4       > x2<-c(1,2,3,4)
  • 例子:

  • x3<- c(TRUE,10,"a")表示字符型

x3<- c(TRUE,10,"a")    
> class(x3) 
[1] "character"
as.numeric(x3)      
[1] NA 10 NA
  • Warning message:强制改变过程中产生了NA

x3<- c(TRUE,10,"a")class(x3)
[1] "character"
 as.numeric(x3)
[1] NA 10 NA
  • Warning message:强制改变过程中产生了NA其他强制转换的函数:as.character()/as.logical()

names函数

x1<- 1:4
names(x1)<-c("a","b","c","d")

数据结构总结:

  • 向量(vector):只能包含同一类型的对像

  • 创建向量:

  1. vector()

  2. c()  说明:使用c()函数,如果其中一个元素是字符,则非字符值强制为字符类型。

  3. as.logical()/as.numeric()/as.character()

矩阵(matrix)

  • 向量+维度属性(整数向量:nrow行,ncol列)
    x<-matrix(nrow = 3,ncol = 2)

  • matrix()至少需要传入两个参数:nrow()/ncol(),那么改矩阵未被赋值,就会以缺失值NA代替
    x<- matrix(1:6,nrow = 2,ncol = 3)
    也可简写为:
    x<- matrix (1:6,2,3)

  • 矩阵是先填充列

  • dim()表示矩阵的维度属性
    dim(x)

  • attributes()用来查找矩阵有多少属性,有哪些属性

矩阵就是向量+维度:

y<-1:6dim(y)<-c(2,3)

拼接矩阵

y2<- matrix(1:6,nrow = 2,ncol = 3)

  • rbind(y,y2)表示合并行nrow

  • cbind(y,y2)列拼接

数组array

  • 与矩阵类似,但是维度可以大于2

x<-array(1:24,dim = c(4,6))
x1<-array(1:24,dim = c(2,3,4))
  • 表示有3个维度,有4个2行3列

列表(list)

  • 可以包含不同类型的对像(与向量vector区别)

  • 矩阵和数组可以包含很多元素,但是多个元素之间必须是一致的。

l<-list("a",2,10L,3+4i,TRUE)
l2<-list(a=1,b=2,c=3)
l3<-list(c(1,2,3),c(4,5,6,7))

矩阵赋名

x<-matrix(1:6,nrow = 2,ncol = 3)
dimnames(x)<-list(c("a","b"),c("c","d","e"))
dimnames(x)<-list(c("a","b"),c("c","d","e","f"))
  • Error in dimnames(x) <- list(c("a", "b"), c("c", "d", "e", "f")) : 'dimnames'的长度[2]必需与陈列范围相等

因子(factor)

  • 因子用来处理 分类数据(分为)有序 vs.无序

  • 因子=整数向量+标签(label)(优于整数向量)

  • 无序:Male/Female vs.有序:1/2

  • 常用与lm(),glm()

创建因子(factor)

x<-factor(c("female","man","female"))
  • 运行如下:

x[1] female man    female
  • Levels: female man (levels就是标签?此处是以female为基线)

y<-factor(c("female","man","female"),levels = c("man","female"))

  • 运行结果如下:

y[1] female man    female

Levels: man female(那么此处就是以man为基线)

  • 可通过levels来设置factor中的基线水平

可使用table函数对感兴趣的factor进行了解:

table(y)
y
man female 
1      2

因子=整数向量+标签(label)

  • levels为factor的一个属性,可以用unclass去除factor的属性
    unclass(x)

  • 运行如下:

unclass(x)[1] 1 2 1
  • attr(,"levels")  曾经的属性为levels,有两个水平(female,male)

[1] "female" "man"   class(unclass(x))

缺失值(missng value)

  • NA/NaN:NaN属于NA,NA不属于NaN

  • NaN一般用于表示数值的缺失

  • NA可表示数值、字符型

  • NA有类型属性存在:integer NA,character NA等

  • is.na()/is.nan()用来判断一个向量中是否存在缺失值

  • example:x<-c(1,NA,2,NA,3)

is.na(x)
[1] FALSE  TRUE FALSE  TRUE FALSEis.nan(x)
[1] FALSE FALSE FALSE FALSE FALSE
  • 试着将x<-c(1,NA,2,NA,3)改为x<-c(1,NaN,2,NaN,3)

数据框(data frame)

  • 用来存储表格数据(tabular data)

  • 视为各元素长度相同的列表:

  • 每个远元素代表一列数据

  • 每个元素的长度代表行数

  • 元素类型可以不用
    df<-data.frame(id=c(1,2,3,4),name=c("a","b","c","d"),gender= c(TRUE,FALSE,FALSE,TRUE))

  • nrow(df)/ncol(df)查看数据框有多少行/列

dfid name gender1  1    a   TRUE2  2    b  FALSE3  3    c  FALSE4  4    d   TRUE
  • 也可nrow(df)/ncol(df)用来查看行/列

  • 区别矩阵:每行每列元素需要一样,但两者结构相似

  • df<-list(id=c(1,2,3,4),name=c("a","b","c","d"),gender= c(TRUE,FALSE,FALSE,TRUE))

  • 运行如下:

>df
$id
[1] 1 2 3 4
                                    $name
[1] "a" "b" "c" "d"
                                    $gender
[1]  TRUE FALSE FALSE  TRUE
  • df2<-data.matrix(id=c(1,2,3,4),name=c("a","b","c","d"),gender= c(TRUE,FALSE,FALSE,TRUE))

  • 运行如下:Error in data.matrix(id = c(1, 2, 3, 4), name = c("a", "b", "c", "d")

  • 参数没有用(id = c(1, 2, 3, 4), name = c("a", "b", "c", "d"), gender = c(TRUE, FALSE, FALSE, TRUE))

  • df3<-data.frame(id=c(1,2,3,4),score=c(80,86,90,100))

  • 运行如下:

df3id score1  1    802  2    863  3    904  4   100
  • data.matrix(df3)转换为矩阵

data.matrix(df3)id score[1,]  1    80[2,]  2    86[3,]  3    90[4,]  4   100

处理缺失值NA

x <- c(1,NA,2,NA,3)is.na(x)
x[is.na(x)]
x[!is.na(x)]
  • complete.cases选取x,y中都不是NA中的缺失值NA,返回值为逻辑(TRUE,FALSE)

x <- c(1,NA,2,NA,3)y<- c("a","b",NA,"c",NA)z<- complete.cases(x,y)x[z]y[z]head(airquality)complete.cases(airquality)g<-complete.cases(airquality)airquality[g,][1:10,]
  • 运行查看各个代码的意义。

向量化操作:

  • 可用于vector、matrix等结构操作,使代码简单已读、易于操作。

x<-1:5
y<-6:10
x+y
x/y
x<-matrix(1:4,nrow = 2,ncol = 2)
y<-matrix(rep(2,4),nrow =2,ncol=2)
x*y
x/y
  • x%*%y矩阵乘

重要函数的使用

目录为:

  • 处理循环:r不仅有for/while循环函数,还有一句话循环函数

  • 排序

  • 总结数据信息

lapply

  • 可以循环处理列表中的每一个元素

  • lapply(参数):lapply(列表,函数/函数名,其他参数)

  • str(lapply)

x<- list(a=1:10,b=c(11,21,31,41,51))lapply(x,mean)sapply(x,mean)
lapply(x,runif)
lapply(x,runif,min=0,max=100)
  • runif函数表示为随机抽取向量,默认的范围为0-1

  • lapply()函数通常传入为list,在上个函数中lapply(x,runif)中的x为一个vector,这样lapply通常会将其强制转化为list

apply

  • 沿着数组的某一维度处理数据

  • 例如:将函数用于矩阵的行和列

  • 虽然与for/while循环的效率相似,但是只用一句话就可以完成

  • apply(参数):apply(数组,维度,函数/函数名)

x<- matrix(1:16,4,4)apply (x,2,mean)apply(x,1,mean)
  • 分别运行产生一下代码:

> x
     [,1] [,2] [,3] [,4][1,]    1    5    9   13[2,]    2    6   10   14[3,]    3    7   11   15[4,]    4    8   12   16
> apply (x,2,mean)[1]  2.5  6.5 10.5 14.5> apply(x,1,mean)[1]  7  8  9 10

apply

  • 沿着数组的某一维度处理数据

  • 例如:将函数用于矩阵的行和列

  • 虽然与for/while循环的效率相似,但是只用一句话就可以完成

  • apply(参数):apply(数组,维度,函数/函数名)

x<- matrix(1:16,4,4)apply (x,2,mean)apply(x,1,mean)
  • 分别运行产生一下代码:

> x
     [,1] [,2] [,3] [,4][1,]    1    5    9   13[2,]    2    6   10   14[3,]    3    7   11   15[4,]    4    8   12   16
> apply (x,2,mean)[1]  2.5  6.5 10.5 14.5> apply(x,1,mean)][1,] -0.6843901 0.1666006 0.6803454[2,]  1.1253118 0.4653100 0.1141857> apply(x,c(1,3),mean)          [,1]        [,2]      [,3]      [,4][1,] 1.2045748 -1.53831670 0.3211516 0.2293316[2,] 0.8996401  0.09853166 1.1504825 0.1244224> apply(x,c(2,3),mean)          [,1]       [,2]      [,3]        [,4][1,] 0.7023668 -1.4052478 0.6801564  0.90456808[2,] 1.6055750 -1.0393436 0.7949597 -0.09736984[3,] 0.8483805  0.2849139 0.7323351 -0.27656733

mapply:

  • lappy的多元版本

  • mapply(参数),mapply(函数/函数名,数据,函数相关参数)

list(rep(1,4),rep(2,3),rep(3,2),rep(4,1))[[1]][1] 1 1 1 1[[2]][1] 2 2 2[[3]][1] 3 3[[4]][1] 4
  • 用mapply完成上面

mapply(rep,1:4,4:1)
  • 自创函数s:

s<- function(n,mean,std)
  • 这个函数中,function用来说明这是一个函数,()中传入需要传入的参数

  • n这里代表从正太分布中随你抽取n个数,mean表示整体分布的均值,std代表这个整体的标准差。

s<- function(n,mean,std){rnorm(n,mean,std)}
s(4,0,1)
mapply(s,1:5,5:1,2)
  • 运行如下:

> mapply(s,1:5,5:1,2)[[1]][1] 1.938297[[2]][1] 4.455111 4.432794[[3]][1] 1.118224 3.751297 5.864922[[4]][1] 4.1675629 1.7385185 0.8987198 0.1048540[[5]][1] -0.3413274  1.2058371 -0.5148753  1.9476646  3.9251892
  • 如果用list表示上面这个则为:

list(s(1,5,2),s(2,4,2),s(3,3,2)...)

tapply

  • 对向量的子集进行操作

  • tapply(参数):tapply(向量,因子/因子列表,函数/函数名)

x<- c(rnorm(5),runif(5),rnorm(5,1))
f<-gl(3,5)
  • gl函数:?gl可自行查看以下

  • rnorm表示正太分布,runif表示均匀分布。

> rnormfunction (n, mean = 0, sd = 1)
>runifrunif(n, min = 0, max = 1)
tapply(x,f,mean)
         1          2          3 
0.08431157 0.36912987 0.92869525

split

  • 根据因子或因子列表将向量或其他对像分组

  • 通常与lapply一起运用

  • split(参数):split(向量/列表/数据框,因子/因子列表)

split(x,f)
lapply(split(x,f),mean)

排序

  • sort:对向量进行排序,返回排好序的内容

  • order:返回排好序的内容的下标/多个排序标准

wy<-data.frame(v1=1:5,v2=c(10,7,9,6,8),v3=11:15,v4=c(1,1,2,2,1))
sort(wy$v2)
[1]  6  7  8  9 10sort(wy$v2,decreasing=TRUE)
[1] 10  9  8  7  6
order(wy$v2)
[1] 4 2 5 3 1

wy[order(wy$v2),]
 v1 v2 v3 v4
4  4  6 14  2
2  2  7 12  1
5  5  8 15  1
3  3  9 13  2
1  1 10 11  1
wy[order(wy$v4,wy$v2),]
 v1 v2 v3 v4
2  2  7 12  1
5  5  8 15  1
1  1 10 11  1
4  4  6 14  2
3  3  9 13  2

wy[order(wy$v2,wy$v4),]
 v1 v2 v3 v4
4  4  6 14  2
2  2  7 12  1
5  5  8 15  1
3  3  9 13  2
1  1 10 11  1



作者:泥人吴
链接:https://www.jianshu.com/p/45cef8da32ba


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消