美文网首页
#R的学习笔记06

#R的学习笔记06

作者: ks_c | 来源:发表于2021-01-29 20:04 被阅读0次

    title: "R的学习笔记04"
    author: "ks_c"
    date: "2021/1/29"
    output: html_document


    <font face="宋体">以下为R数据分析指南与速查手册 第二章的内容</font>

    2.1 向量

    注意事项

    • 向量内部的数据是同一类型

    b <- c(1,'a')
    b
    [1] "1" "a" #这里的1和a都是字符串
    typeof(b)
    [1] "character"

    • 可以个不存在的元素赋值,如果新赋值的元素与旧元素间有多个不存在的元素,那么这几个元素将变成NA。

    x <- 1:5
    x[8] <- 6
    x
    [1] 1 2 3 4 5 NA NA 6
    x["a"] <- 8
    x
    a
    1 2 3 4 5 NA NA 6 8

    • 元素名

    b <- c(x1=1.2,3.5,x3=pi)
    names(b)
    [1] "x1" "" "x3"
    b
    x1 x3
    1.200000 3.500000 3.141593

    names(b)[2] <- "x2"
    names(b)[1] <- "x1_0"
    b
    x1_0 x2 x3
    1.200000 3.500000 3.141593

    • 向量删除

    x <- c(0.5,1,100)
    删除第1个元素
    x <- x[-1]
    x
    [1] 1 100
    x <- x[-length(x)] # 删除结尾元素
    x
    [1] 100

    • 向量查询

    x[x>3.1&x<=8]
    [1] 4 5 6 7 8

    &、|、!为向量中各元素分别求“与”、“或”、“非”,而&&、| |为向量第一个元素求“与”、“或”。 如果要求向量内部所有元素求“与”,用函数all,如果要求向量内部所有元素求“或”,用函数any

    c(T,T,F)&c(T,F,F)
    [1] TRUE FALSE FALSE
    c(T,T,F)&&c(T,F,F)
    [1] TRUE
    all(c(T,T,T))&T
    [1] TRUE
    all(c(T,T,F))&T
    [1] FALSE
    all(c(T,T,F))
    [1] FALSE
    all(c(T,T,T))
    [1] TRUE
    any(c(T,T,T))
    [1] TRUE
    any(T,T,F)
    [1] TRUE

    • %in%:判断运算符前面的对象的各元素是否在后面对象的元素中,返回值的长度总与前面向量的长度相同。如:

    c("a","b") %in% c("b","d")
    [1] FALSE TRUE

    is.element(x, y)类似于x%in%y

    x <- 1:4;y <- 3:5
    is.element(x,y)
    [1] FALSE FALSE TRUE TRUE

    which函数:不仅查询满足条件的值是多少,还可以查询他们在原向量中的位置。
    其用法为:

    which(x, arr.ind = FALSE, useNames = TRUE)

    x:逻辑向量,返回元素为TRUE的位置。
    如果仅需知道第1个为TRUE的位置,在后面加一个[1]即可,例如:

    x <- c(1:6)
    x
    [1] 1 2 3 4 5 6
    which(x>3)
    [1] 4 5 6
    which(x>3)[1]
    [1] 4

    -排序

    x <- c(5:1,6,pi)
    x
    [1] 5.000000 4.000000 3.000000 2.000000 1.000000
    [6] 6.000000 3.141593
    y1 <- x[order(x)]# order()函数从小到大排序
    y1
    [1] 1.000000 2.000000 3.000000 3.141593 4.000000
    [6] 5.000000 6.000000

    y2 <- x[order(x,decreasing = TRUE)] # 用order()函数从大到小排
    y2
    [1] 6.000000 5.000000 4.000000 3.141593 3.000000 2.000000 1.000000

    y12 <- sort(x) # 用sort函数
    y12
    [1] 1.000000 2.000000 3.000000 3.141593 4.000000 5.000000 6.000000
    y22 <- sort(x,decreasing = TRUE) #从大到小排
    y22
    [1] 6.000000 5.000000 4.000000 3.141593 3.000000 2.000000 1.000000

    关于向量的其他常见函数,请见troubleisafriend,
    R语言常用数学函数

    位置最大、最小值所在的位置用函数which.max和which.min

    • 向量的翻转

    x <- seq(2,10,by=2)
    x <- x[length(x):1]
    x
    [1] 10 8 6 4 2

    x <- rev(x)
    x
    [1] 2 4 6 8 10

    • 向量的集合运算

    交集:intersect(x, y);
    并集:union(x, y);
    差集:setdiff(x, y)[1]
    集合是否相等:setequal(x, y);
    确定元素是否是集合的某个元素:is.element(x, y),它等价于x %in% y
    以上函数只能对两个变量进行计算。
    使用Reduce(function, x, init, right = FALSE, accumulate = FALSE)函数[2]可以批量操作:

    Reduce(intersect, list(a,b,d))

    [1] : 除去a中b的部分(A-B)
    [2] : 将x中第1、2元素进行function操作,然后对操作完的值和第三个元素进行function操作,知道用尽x内的元素详见

    • 向量的算术运算
    • 加:+
    • 减:-
    • 乘:*
    • 除:/
    • 取模(余数):%%
    • 整除:%/%
    • 乘方:^或**

    2.2. 简单列表

    list可以为任意类型数据,一般函数的输出结果均为list。

    任意几个列表可以合成一个新列表。

    • 列表的串联和元素插入

    如果我们需要让两个列表的元素组成新的列表,依然用函数c将多个列表连接起来,返回的是列表而不是向量。
    也可以用append()函数。

    append(x, values, after = length(x))(
    append函数也可用于向量,也是取向量values中的元素。
    如果原列表的元素有名字,则新列表的元素继承其名字,如果原列表元素没有名字,在append函数中没有添加名字的功能,可以在之后单独用names()函数添加名字。

    > x1 <- list(a=1,b="Apple",c=TRUE,d=1:3)
    > x2 <- list(e=5+3i,f=c(1.5,2.6))
    > # 列表的元素作为新列表的元素
    > y1 <- append(x1,x2)
    > y1
    ## $a
    ## [1] 1
    ## 
    ## $b
    ## [1] "Apple"
    ## 
    ## $c
    ## [1] TRUE
    ## 
    ## $d
    ## [1] 1 2 3
    ## 
    ## $e
    ## [1] 5+3i
    ## 
    ## $f
    ## [1] 1.5 2.6
    
    >length(y1)
    [1] 6
    
    y12 <- c(x1,x2)
    y12
    ## $a
    ## [1] 1
    ## 
    ## $b
    ## [1] "Apple"
    ## 
    ## $c
    ## [1] TRUE
    ## 
    ## $d
    ## [1] 1 2 3
    ## 
    ## $e
    ## [1] 5+3i
    ## 
    ## $f
    ## [1] 1.5 2.6
    
    length(y12)
    ## [1] 6
    
    # 向量的元素作为新向量的元素
    y2 <- append(x1,1:5)
    y2
    ## $a
    ## [1] 1
    ## 
    ## $b
    ## [1] "Apple"
    ## 
    ## $c
    ## [1] TRUE
    ## 
    ## $d
    ## [1] 1 2 3
    ## 
    ## [[5]]
    ## [1] 1
    ## 
    ## [[6]]
    ## [1] 2
    ## 
    ## [[7]]
    ## [1] 3
    ## 
    ## [[8]]
    ## [1] 4
    ## 
    ## [[9]]
    ## [1] 5
    
    length(y2)
    ## [1] 9
    
    # 列表本身作为新列表的元素
    y3 <- list(x1,x2)
    y3
    ## [[1]]
    ## [[1]]$a
    ## [1] 1
    ## 
    ## [[1]]$b
    ## [1] "Apple"
    ## 
    ## [[1]]$c
    ## [1] TRUE
    ## 
    ## [[1]]$d
    ## [1] 1 2 3
    ## 
    ## 
    ## [[2]]
    ## [[2]]$e
    ## [1] 5+3i
    ## 
    ## [[2]]$f
    ## [1] 1.5 2.6
    
    length(y3)
    ## [1] 2
    

    当在append函数中指定after值的时候,可用于元素的插入

    2.3 矩阵

    矩阵本质上是由维度的向量。向量能够进行的操作矩阵也可以进行。

    矩阵创建

    matrix(data = , nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
    byrow=F为按列进行排列,在这里我详细说明。

    矩阵的提取

    [ ]内只有一个参数时按列提取

    x <- matrix(1:8,nrow=2,byrow=T)
    x
         [,1] [,2] [,3] [,4]
    [1,]    1    2    3    4
    [2,]    5    6    7    8
    
    x[2]
    5
    
    length(x)
    8
    

    矩阵的拼接

    横向拼接:cbind,
    纵向拼接:rbind,

    被拼接的对象可以是矩阵,也可以是向量。他们在拼接方向需要有相同的维度。

    #dim(x)可以查看维度
    > dim(x)
    [1] 2 4
    

    当横向拼接向量时,向量被视为行向量;当纵向拼接向量时,其被视为列向量。

    m1 <- matrix(1:8,nrow = 2)
    m2 <- matrix(1:4,nrow = 2)
    m3 <- matrix(1:12,nrow = 3)
    v1 <- 1:4
    v2 <- 1:3
    cbind(m1,m2)
    
    ##      [,1] [,2] [,3] [,4] [,5] [,6]
    ## [1,]    1    3    5    7    1    3
    ## [2,]    2    4    6    8    2    4
    
    rbind(m1,m3)
    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    3    5    7
    ## [2,]    2    4    6    8
    ## [3,]    1    4    7   10
    ## [4,]    2    5    8   11
    ## [5,]    3    6    9   12
    
    rbind(m1,v1)
    ##    [,1] [,2] [,3] [,4]
    ##       1    3    5    7
    ##       2    4    6    8
    ## v1    1    2    3    4
    
    cbind(m3,v2)
    ##               v2
    ## [1,] 1 4 7 10  1
    ## [2,] 2 5 8 11  2
    ## [3,] 3 6 9 12  3
    

    特殊矩阵的创建

    1. 全0矩阵(初始化)

    matrix(data = 0, nrow = 2, ncol = 2)即可得到2 x 2的全部为0的矩阵

    1. 对角阵

    diag(x = 1, nrow, ncol, names = TRUE)

    • x可以是数字或矩阵或一维数组
    • names=T:如果矩阵x 有名称则继承其名称。

    当仅包含两个参数,第1个参数为单元素,第2个参数为整数n时,表示创建n维对角矩阵,每个对角元素都为第1个参数。
    第1个元素的类型可以是整数型、实数型、复数型或逻辑型,不能是字符串型。对逻辑型来说,非对角的地方为FALSE。

    也可以创建对角线上元素不同的矩阵,此时将对角线上的元素以向量的方式作为diag的第一个参数,矩阵的维度与该向量的长度相同。如果指定维度,若对角线上元素长度小于行数与列数中的最小值,指定对角线向量会复制多份首尾相连。

    当x为矩阵时,则不可以指定nrow和ncol,直接输出x对角线上的值。

    > diag(x,length(x))
         [,1] [,2] [,3] [,4]
    [1,]    1    0    0    0
    [2,]    0    2    0    0
    [3,]    0    0    3    0
    [4,]    0    0    0    4
    
    x<- matrix(1:20)
    > dim(x) <- c(4,5)
    > x
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    5    9   13   17
    [2,]    2    6   10   14   18
    [3,]    3    7   11   15   19
    [4,]    4    8   12   16   20
    > diag(x)
    [1]  1  6 11 16
    

    行列名称

    m1 <- matrix(1:8,nrow = 2, dimnames = list(c("r1","r2"),c("c1","c2","c3","c4")))
    m1
    ##    c1 c2 c3 c4
    ## r1  1  3  5  7
    ## r2  2  4  6  8
    
    rownames(m1) <- c("p1","p2")
    m1
    ##    c1 c2 c3 c4
    ## p1  1  3  5  7
    ## p2  2  4  6  8
    
    row.names(m1) <- c("R1","R2")
    m1
    ##    c1 c2 c3 c4
    ## R1  1  3  5  7
    ## R2  2  4  6  8
    
    dimnames(m1) <- list(c("rr1","rr2"),c("cc1","cc2","cc3","cc4"))
    m1
    ##    cc1 cc2 cc3 cc4
    ## rr1  1  3  5  7
    ## rr2  2  4  6  8
    

    矩阵的提取

    m2 <- m[1 , , drop = FALSE]
    单行矩阵

    矩阵转置、翻转、旋转

    转置:
    t(m1)

    上下翻转:
    m1[nrow(m1):1, ]

    左右翻转:
    m1[ ,ncol(m1):1]

    顺时针90度旋转:
    t(apply(m1, 2, rev))

    逆时针90度旋转:
    t(apply(t(m1), 2, rev))

    运算

    矩阵级运算1 矩阵级运算2

    2.4 高维数组

    数组是具有维度(dim)属性的向量。矩阵是一种特殊的数组(一维)。
    array(x, c(3, 4, 2))二维的两个3 x 4的矩阵组成的数组

    >x <- array(1:3, c(2,4,2))
    ## , , 1
    ## 
    ##      [,1] [,2] [,3] [,4]
    ## [1,]    1    3    2    1
    ## [2,]    2    1    3    2
    ## 
    ## , , 2
    ## 
    ##      [,1] [,2] [,3] [,4]
    ## [1,]    3    2    1    3
    ## [2,]    1    3    2    1
    
    

    数组拼接

    abind包中的abind()函数:abind(..., along=N)。

    x
    y<- x+100
    #按行拼接
    abind(x,y, along=1)
    
    # 列方向拼接
    abind(x,y, along=2)
    
    # 页方向拼接
    abind(x,y, along=3)
    
    # 新的维度上拼接,新维度作为第1维,之前的维度顺次后移
    abind(x,y, along=0)
    

    2.5 数据框

    数据框是一种特殊的列表,列表中每个元素都是一个有名字的向量,且这些向量的长度相同。不同的向量可以是不同类型的。数据框是统计分析中最常用的数据结构。

    创建

    name <- c("Alice","Bob","Christien")
    age <- c(10,20,14)
    gender <- c("F","M","F")
    weight <- c(25,50,30)
    df <- data.frame(name,age,gender,weight)
    df
    ##        name age gender weight
    ## 1     Alice  10      F     25
    ## 2       Bob  20      M     50
    ## 3 Christien  14      F     30
    

    如果有字符串,dataframe中的字符串会被认为是因子类型。用stringsAsFactor=F可以阻止变为字符串。

    所谓因子型,简单来说是包含顺序的字符串,顺序可由用户指定。在建模时,会被作为整数处理。

    # 抑制字符串向因子型的转换
    df2 <- data.frame(name,age,gender,weight,stringsAsFactors=FALSE)
    df2
    

    行名,列明的创建、提取和修改。

    向量名被默认作为数据框的列名。
    矩阵列名也会默认作为数据框列名。
    如果数据框没有指定列名,则列名默认为“V1”、“V2”…,如果数据框没有指定行名,则行名默认为“1”、“2”、“3”…。
    获取数据框列名,可用names函数或colnames函数。
    获取数据框行名,可用row.names函数或rownames函数。
    对数据框来说,row.names函数效率更高,因而推荐使用row.names函数。

    在实际数据分析中,修改行名的做法很少见,更多的是增加一个ID列,然后做相应的修改。

    提取数据时如果需要保持为单列数据框,可以添加drop = FALSE参数

    # 给一个尚不存在的列赋值,即增加该列
    df$new <- 1:4
    
    df[5] <- NULL # 删除该列
    # 可以通过序号的方式增加1列
    df[5] <- c(T,F,F,T)
    df
    
    df <- data.frame(name,age,gender,weight) # 注意此处字符串会转化为因子型
    
    df5 <- rbind(df3,df4)
    
    df7 <- cbind(df1,df6)
    
    #将相同的列合并,可以用merge函数
    #merge函数会删除重复的相同列,而且可以根据相同列的顺序合并(相当于Excel中的=vlookup)
    

    条件查询

    subset(x, subset, select, drop=F)
    subset参数可以提取行方面满足条件
    select参数可以为列方面选取的范围

    df2 <- subset(df,subset = name!="Einstein"&age>10,select = c(age:weight,height))
    # !=为不等于
    df2
    

    排序

    如果需要根据一列或多列的顺序,对其他列做相应的调整,可以使用order函数。如果需要将所有列都按降序排序,则增加decreasing = TRUE参数。如果大多数升序,某些降序,在降序的列前加-rank函数(如果是数值型,仅加负号就可以)。如果大多数降序,某些升序,在升序前加-rank函数函数,且添加decreasing = TRUE参数。下面是一些列子:

    name <- c("Alice","Bob","Christien","Einstein")
    age <- c(10,20,14,25)
    gender <- c("F","M","F","M")
    weight <- c(25,50,30,54)
    nationality <- c("USA","UK","China","German")
    height <- c(1.2,1.65,1.43,1.75)
    df <- data.frame(name,age,gender,weight,nationality,height)
    #gender、weight两列将序排列
    df2 <- df[order(df$gender,df$weight,decreasing = TRUE),]
    # gender降序,其余升序排列
    # gender列前加一个-rank()就表示与默认排序方式不同。
    df3 <- df[order(-rank(df$gender),df$weight),]
    #gender升序,weight降序(数值变量直接加-即可)
    df4 <- df[order(df$gender,-df$weight),]
    
    

    相关文章

      网友评论

          本文标题:#R的学习笔记06

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