• R语言基础:数组&列表&向量&矩阵&因子&数据框


    R语言基础:数组和列表

    数组(array)
    一维数据是向量,二维数据是矩阵数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的.
    数组函数是array(),语法是:array(dadta, dim),其中data必须是同一类型的数据,dim是各维的长度组成的向量。
    1、产生一个三维和四维数组。
    例1:xx <- array(1:24, c(3, 4, 2)) #一个三维数组
    例2:yy <- array(1:36, c(2, 3, 3, 2)) #一个四维数组
     
    2、dim()函数可将向量转化成数组或矩阵。
    例1:xx <- 1:24; dim(xx) <- c(3, 4, 2); xx #效果同array(1:24, c(3, 4, 2))
    例2:zz <- 1:10; dim(zz) <- c(2, 5); zz #效果同matrix(1:10, 2, 5) 
     
    列表(list)
    向量、矩阵和数组的元素必须是同一类型的数据一个数据对象需要包含不同的数据类型,它可以采用列表这种形式
    创建列表可用list()函数,语法是:list(name1 = component1, name2 = component2, ...)。
    1、创建一个列表
    例1: xx <- rep(1:2, 3:4)
    yy <- c('Mr A', 'Mr B', 'Mr C', 'Mr D', 'Mr E', 'Mr D', 'Mr F')
    zz <- 'discussion group'
    name.list <- list(group = xx, name = yy, decription = zz) #创建了一个名为"name.list"的列表
    name.list$n[name.list$g == 2]
    length(name.list)
    mode(name.list)
    names(name.list)

    向量(vector)

    1、seq():产生有规律的数列,间距省略时默认值为1。
    例1:seq(10, 20, 0.5)
    例2:seq(0, by = 0.03, length = 15)
     
    2、rep():产生有规律的数列,重复第一个变量若干次。
    例1:rep(1:3, 1:3)
    例2:rep(1:3, rep(2, 3))
    例3:rep(1:3, length = 10)
     
    3、向量运算:一般是对应元素之间的运算,所以两个或多个向量运算时,要求它们包含的元素个素相同(或一个是另一个的整数倍)。
    例1:a <- 1:3; b <- 4:6; a * b; b^a
    例2:a <- 1:3; b <- 4:9; a * b; b^a
     
    4、获取向量某一个或多个子集,向量前的负号"-"表示去除相应内容。
    例1:x <- c(3, 4, 5, 2, 6); x[1:2]; x[-(1:2)]
    例2:x <- c(3, 4, 5, 2, 6); x[c(1, 2, 4, 1)]; x[-c(1, 2, 4, 1)]
    例3:xx <- seq(1, by = 3, length = 10); xx[xx > 13]
    例4:x <- 1:20; y <- -9:11; x[y > (1)] #注意最后一个是"NA"
     
    5、主要向量运算函数。
    例1:xx <- c(2, 6, 10, 8, 4)
    sum(xx) #和
    max(xx) #最大值
    min(xx) #最小值
    range(xx) #取值范围
    mean(xx) #平均值
    var(xx) #方差
    sort(xx) #从小到大排序
    rev(xx) #反排列, 所以从大到小排序应该是rev(sort(xx))
    rank(xx) #单元值大小顺序
    prod(xx) #乘积,所以阶乘是prod(1:n)
    例2:x <- seq(1, 15, 2)
    append(x, 20:30, after = 5) #插入数据
    append(x, 20:30) #参数after缺省默认从向量的最后插入值
    replace(x, c(2, 4, 6), -1) #替换函数
    例3:state.name
    match(c('Ohio', 'Wyoming'), state.name) #完全匹配函数
    pmatch(c('Oh', 'Wy'), state.name) #部分匹配函数
    state.name[pmatch(c('Oh', 'Wy'), state.name)]
    例4:yy <- -9:10
    all(yy > 0) #判断所有
    all(yy > -10)
    any(yy == 0) #判断部分
    any(yy > 0)
    any(yy < -10)
    矩阵
    矩阵(matrix)
    矩阵生成函数matrix():matrix(data, nrow = , ncol = , byrow = F),其中,数据data是必须的,其他都是选择参数,可以不选。byrow = F默认为按列来排列数据,如果想要按行排列,令byrow = T。
    1、对角矩阵和单位阵。
    例1:x <- 1:6; diag(x) #对角矩阵
    例2:y <- rep(1, 5); diag(y) #单位阵
     
    2、矩阵下标
    例1:xx <- matrix(1:20, 4, 5)
    xx[2, 2]; xx[2, 3:5]; xx[3:4, 3:4]
    xx[2, ]; xx[ , 2]
     
    3、代数意义下的矩阵乘法"%*%"
    例1:yy <- matrix(1:6, 3, 2); zz <- matrix(1:6, 2, 3)
    yy %*% zz; zz %*% yy
     
    4、矩阵行和列的维数
    例1:xx <- matrix(1:20, 4, 5)
    dim(xx) #行和列的维数
    nrow(xx); ncol(xx) #行数和列数
     
    5、矩阵的主要运算函数
    例1:x <- 1:6; y <- as.matrix(x) #转换成矩阵
    is.matrix(x); is.matrix(y) #判断是否矩阵
    例2:   diag() #方阵对角线元素或者生成对角矩阵
    apply() #对矩阵应用函数
    eigen() #求特征值和特征向量
    solve() #求逆矩阵
    chol() #Choleski分解
    svd() #奇异值分解
    qr() #QR分解
    det() #求行列式
    dim() #给出行列数
    t() #矩阵转置
     
    6、矩阵合并
    例1:aa <- matrix(1:6, 3, 2);  bb <- matrix(7:12, 3, 2)
    cbind(aa, bb) #按列合并
    rbind(aa, bb) #按行合并
     
    7、矩阵apply()运算函数:语法是apply(data, dim, function),dim取1表示对行运用函数,取2表示对列运用函数。
    例1:xx <- matrix(1:20, 4, 5)
    colMeans(xx) #列均值
    colSums(xx) #列和
    其余大部分都要用到apply()函数
    例2:xx <- matrix(1:20, 4, 5)
    apply(xx, 2, mean) #列均值,等同于colMeans(xx)
    apply(xx, 2, sum) #列和,等同于colMeans(xx),所以矩阵行和列的运算推荐用apply()。
    apply(xx, 1, var) #行方差
    apply(xx, 2, max) #每列最大值
    apply(xx, 2, rev) #每列的数反排列
     
    因子(factor)和有序因子(ordered factor)

    一、因子的特点或性质

    1、因子可视为C或JAVA语言中的枚举,适用于有限状态的表示。

    2、因子不可以赋枚举集合外的值,如一个因子包含male,female,则不能再赋male和female以为的值,赋其他值会将该元素设置为空值。

    因子用来存储类别变量(categorical variables)和有序变量,这类变量不能用来计算而只能用来分类或者计数。因子表示分类变量,有序因子表示有序变量。

    因子factor

      在R语言中,因子(factor)表示的是一个符号、一个编号或者一个等级,即,一个点。例如,人的个数可以是1,2,3,4......那么因子就包括,1,2,3,4.....还有统计量的水平的时候用到的高、中、低,也是因子,因为他是一个点。与之区别的向量,是一个连续性的值,例如,数值中有1,1.1,1.2......可以作为数值来计算,而因子则不可以。如果用我自己的理解,简单通俗来讲:因子是一个点,向量是一个有方向的范围。

      在R中,如果把数字作为因子,那么在导入数据之后,需要将向量转换为因子(factor),而因子在整个计算过程中不再作为数值,而是一个"符号"而已。

    因子(factor)和有序因子(ordered factor)
    因子用来存储类别变量(categorical variables)和有序变量,这类变量不能用来计算而只能用来分类或者计数。
    因子表示分类变量,有序因子表示有序变量
    生成因子数据对象的函数是factor(),语法是factor(data, levels, labels, ...),其中data是数据,levels是因子水平向量,labels是因子的
     
    标签向量。
    1、创建一个因子。
    例1:colour <- c('G', 'G', 'R', 'Y', 'G', 'Y', 'Y', 'R', 'Y')
    col <- factor(colour)
    col1 <- factor(colour, levels = c('G', 'R', 'Y'), labels = c('Green', 'Red', 'Yellow')) #labels的内容替换colour相应位置对应levels的内容
    col2 <- factor(colour, levels = c('G', 'R', 'Y'), labels = c('1', '2', '3'))
    col_vec <- as.vector(col2) #转换成字符向量
    col_num <- as.numeric(col2) #转换成数字向量
    col3 <- factor(colour, levels = c('G', 'R'))
    2、创建一个有序因子。
    若因子需要有序,比如差,一般,好,很好,非常好,则可使用order参数:order=TRUE。
    例1:score <- c('A', 'B', 'A', 'C', 'B')
    score1 <- ordered(score, levels = c('C', 'B', 'A')); score1
    3、用cut()函数将一般的数据转换成因子或有序因子。
    例1:exam <- c(98, 97, 52, 88, 85, 75, 97, 92, 77, 74, 70, 63, 97, 71, 98, 65, 79, 74, 58, 59, 60, 63, 87, 82, 95, 75, 79, 96, 50, 88)
    exam1 <- cut(exam, breaks = 3) #切分成3组
    exam2 <- cut(exam, breaks = c(0, 59, 69, 79, 89, 100)) #切分成自己设置的组
    attr(exam1, 'levels'); attr(exam2, 'levels'); attr(exam2, 'class')
    ordered(exam2, labels = c('bad', 'ok', 'average', 'good', 'excellent')) #一个有序因子
     
    数据框
    数据框(data frame)
        数据框是一种矩阵形式的数据,但数据框中各列可以是不同类型的数据。数据框每列是一个变量,每行是一个观测。数据框可以看成是矩阵的推广,也可看作一种特殊的列表对象,很多高级统计函数都会用到数据框。
    数据框用函数data.frame()生成,语法是:data.frame(data1, data2, ...)
    1、生成一个数据框
    例1:name <- c('Mr A', 'Mr B', 'Mr C'); group <- rep(1, 3); score <- c(69, 71, 92)
    dd <- data.frame(name, group, score)
     
    2、合并数据框
    例1:name <- c('Ms C', 'Ms D'); group <- c(2, 2); score <- c(93, 99)
    dd1 <- data.frame(name, score, group) #注意这里排列顺序与dd中不同
    dd2 <- rbind(dd, dd1) #行合并结果与dd排列顺序一致,说明其中有一个匹配过程。
    dd3 <- rbind(dd1, dd)
    例2:age <- c(14, 15, 14, 16, 13)
    dd4 <- cbind(dd2, age) #列合并
    dd4[2, 3]; dd4$score[2]
     
    3、"连接"函数
    attach()和detach()函数是应用数据框时很有用的工具。attach()函数将数据框连接入当前工作空间,detach()取消连接。
    如果不用attach(),需要用$提取数据框内某一列数据。
    1、attach()和detach()函数的应用
    例1:girl1 <- read.table('d:/girl1.txt', head = T) #读取数据
    WT2
    attach(girl1) #连接入当期工作空间
    WT2 <- 12:13
    mode(WT2) #结果时数值型
    rm(WT2)
    detach(girl1) #取消连接
    WT2
    girl1$WT2
     

    -----R对象和数据组织---------------

    来源:http://blog.csdn.net/enjoy_learn/article/details/52422501

    R的数据对象:
    ---存储角度:数值型,字符型,逻辑型
    ---结构角度:向量(具有相同存储类型数据的集合)
                          矩阵(列:变量,行:观测)--二维表格
                        数组(多张二维表的集合)
                        数据框(与矩阵类似,用于存储多个存储类型不同的变量)
                        列表:向量、矩阵、数组、数据框的集合
    -----------------------------------------------------------------
    创建和访问R的数据对象
    ---(1)创建R的数据对象:对象名<-R常量或R函数
    --- (2)访问R的数据对象:对象名或print(对象名)
    ----(3)查看R的数据对象的结构:str(对象名)
    -----(4)管理R的数据对象:ls():显示当前工作区间的变量名列表
    -------rm(对象名或对象名列表),remove(对象名):删除当前工作区间的指定对象。
    -----------------------------------------------------------------------
       调用R的向量组织数据
    判断数据对象是否为向量:is.vector(数据对象名)
    创建只包含一个元素的向量:标量
    ------对象名<-R常量
    -----(V4<-TRUE),幅值语句直接放入括号内,表示创建对象,并直接显示对象值
    -----#开头的程序行为注释
     
    创建包含多个元素的向量
    ---包含多个元素的目的是:保存一个变量到R中。----对象名<-R函数
    最常用的R函数是C函数,seq,rep,
    > holderage<-c(22,22,23,23)
    > length(holderage)
    [1] 4
    > vehiclegroup<-rep("A",each=4)
    > vehiclegroup
    [1] "A" "A" "A" "A"
    > vehiclleage<-seq(from=1,to=4,by=1)
    > vehiclleage
    [1] 1 2 3 4
    > claimamt<-c(2312,2256,1064,1280)
    > claimamt
    [1] 2312 2256 1064 1280
    > nclaims<-c(8,8,4,1)
    > nclaims
    [1] 8 8 4 1
    > str(vehiclegroup)
     chr [1:4] "A" "A" "A" "
     
    向量相同,可以使用赋值语句,向量元素相同,可借助重复函数和序列函数简化书写
     
    rep重复函数
    rep(起始值:终止值,each=重复次数)或times=重复次数
     (vehiclegroup<-rep(10:15,times=4))
     [1] 10 11 12 13 14 15 10 11 12 13 14 15 10 11 12 13 14 15 10 11 12 13 14 15
    > (vehiclegroup<-rep(10:15,each=4))
     [1] 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 15
     
    seq序列函数
       seq(from=起始值,to =终止值,by=步长)
        seq(from=起始值,to =终止值,by=个数)   
    scan键盘数据读入函数
              R支持从键盘输入一组数据到指定向量中,函数书写:
                    对象名<-scan()
                每个数据间以回车键分隔,所有数据输入完毕后,按住Ctrl+回车键表示结束输入。
    Vector创建向量函数
            vector(length=元素个数),创建的初值默认为FALSE,需通过向量元素访问,给各元素赋予具体值
     vector(length=5)
    [1] FALSE FALSE FALSE FALSE FALSE
     
    访问向量中为元素
    -----访问指定位置上的元素:
    > a<-vector(length=10)
    > a
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    > a[1]<-1
    > a[2:4]<-c(2,3,4)
    > a
     [1] 1 2 3 4 0 0 0 0 0 0
    > b<-seq(from=5,to=9,by=1)
    > b
    [1] 5 6 7 8 9
    > a[5:9,10]<-c(b,10)
    Error in a[5:9, 10] <- c(b, 10) : 矩阵里的下标数目不对
    > a
     [1] 1 2 3 4 0 0 0 0 0 0
    > a[c(5:9,10)]<-c(b,10)
    > a
     [1]  1  2  3  4  5  6  7  8  9 10
    -----利用位置向量访问指定位置上的元素
     
    利用逻辑型位置向量访问指定位置上的元素,a[b],b的长度不够a的长度时,按b 先前的顺序取值
    -------访问指定元素之外的元素
    向量名[-位置常量];访问除第几个元素以外的元素
    向量名[-位置常量1:位置常量2]
    向量名[-c(5:9),10]
    向量名[-位置向量名]

    用R的矩阵组织数据,
    可通过is函数判断数据对象是否为矩阵。
    is.matrix(数据对象名)
    2016/09/03 14:07
    由向量创建矩阵:
    cbind(向量名列表):各向量存储类型一致
    ClaimData<-cbind(holderage,vehiclege,claimamt,nclaims) 
    dim(矩阵名):显示矩阵行列数
    colnames(ClaimData)  : 显示矩阵各列名称
    colnames(ClaimData [,2:4])  显示矩阵指定列名称
    rownames(ClaimData)<-c("1","2","3","4"),给矩阵各行命名
    显示指定行名称:rownames(Claimdata[c(1,3),])
    rbind(a,b)  行合并函数
    ------------由单个向量派生矩阵
    矩阵中的元素已存在于一个向量中
    matrix(向量名,nrow=行数,ncol=列数,byrow=TRUE/FALSE,...)
    a<-matrix(a,nrow=5,ncol=6,byrow=FALSE,dilnames=list(dim1,dim2));
    ---------访问矩阵中的元素:
    1)访问指定位置上的元素
    矩阵名[行位置常量,列位置常量]
    矩阵名[c(1,2),c(1,3)] 
    2)访问指定行上的所有元素
    head(矩阵名,n)
    tail(矩阵名,n)
    3)访问指定列上的所有元素
    4)利用编辑窗口访问矩阵元素
    fix(矩阵名)
    ---------------------------------------------------------------------------------------------------------------------------------------
    数据框用于存储多个存储类型不尽相同的变量;
          统计                计算机
    行:观测----------记录
    列:变量----------域
    判断数据对象是否为数据框
    is.data.frame(数据对象名)  TRUE?FALSE
    创建数据框
    ChaimDataFrm<-data.frame(域名1=向量名1,域名2=向量名2,。。。)
    创建数据表时,数据框中是空的,通过:numeric(0)创建一个不包含任何数据的数值型的域。
    访问数据框
    (1)矩阵方式访问
    (2)数据框名$域名
            数据框名[["域名"]]
            数据框名[[域编号]]
    还可:
            attach(数据框名)
            访问域名函数1
            访问域名函数2
            detach(数据框名)
    还可:
        with(数据框名,{
                域访问函数1
                域访问函数2
                })
    with内为局部环境,类似C语言里的局部变量。
    若修改数据框中的值或增加新的域,需采用within函数
    数据框名<-within(数据框名,{
                            域访问函数
                            域修改函数
                                    })
    在{ }内生成的新向量均默认加入数据框,成为新的域。
  • 相关阅读:
    并查集基本操作及其优化
    POJ-3159.Candies.(差分约束 + Spfa)
    差分约束和最短路径(算法导论)
    POJ-3660.Cow Contest(有向图的传递闭包)
    Floyd-Warshall算法计算有向图的传递闭包
    深入理解链式前向星
    POJ-1860.CurrencyExchange(Spfa判断负环模版题)
    HDU-4725.TheShortestPathinNyaGraph(最短路 + 建图)
    POJ-3268.SilverCowParty.(最短路 + 图的转置)
    POJ-1797.HeavyTransportation(最长路中的最小权值)
  • 原文地址:https://www.cnblogs.com/nxld/p/6085800.html
Copyright © 2020-2023  润新知