R语言学习笔记

作者: 泥人吴 | 来源:发表于2018-07-23 23:56 被阅读152次

    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:6
    dim(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 FALSE
    is.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)查看数据框有多少行/列
    df
    id name gender
    1  1    a   TRUE
    2  2    b  FALSE
    3  3    c  FALSE
    4  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))

    • 运行如下:

    df3
    id score
    1  1    80
    2  2    86
    3  3    90
    4  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表示均匀分布。
    > rnorm
    function (n, mean = 0, sd = 1)
    >runif
    runif(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 10
    sort(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
    

    总结数据信息summarize data

    • head(airquality)查看前六行
    • tail(airquality)查看后六行
    • summary,str,dim
    • table(airquality$Month)
    • 内容有点多,仔细看

    相关文章

      网友评论

        本文标题:R语言学习笔记

        本文链接:https://www.haomeiwen.com/subject/pqxtmftx.html