• R语言数据结构


    5. 数据结构

    5.1 数据结构简介

    (1)向量

    一个向量的所有元素必须有相同的类型(模式)

    (2)列表

    列表可以非同质的

    列表可按位置索引:lst[[2]]

    抽取子列表:lst[c(2,5)]

    列表可以有名称:lst[[“Moe”]]或者lst$Moe

    列表类似于字典、散列表等

    (3)模式:实体类型

    > mode(3.1415)

    R中每个对象都有一个模式,表明该对象如何存储在存储器中:

    对象

    例子

    模式

    Number

    3.14

    numeric

    Vector of numbers

    c(2.7, 3.14)

    numeric

    Character string

    “Moe”

    character

    Vector of Character string

    c(“Moe”, “Larry”)

    character

    Factor

    factor(c(“NY”,”CA”,”IL”))

    numeric

    List

    list(“Moe”,”Larry”)

    list

    Data frame

    data.frame(x=1:3, y=c(“NY”,”CA”,”IL”))

    list

    Function

    print

    function

    (4)类:抽象类型

    > d <—as.Date(“2010-03-10”)

    > class(d)             //结果是“Date”

    R中每个对象有一个定义它们抽象类型的类(class)

    (5)纯量(常量)

    又叫做拥有唯一元素的向量

    (6)矩阵

    R中矩阵只是有维数的向量

    向量的维数,初始值为NULL

    > A <—1:6

    > dim(A)<— c(2,3)           //成为2*3的矩阵

    (7)数组(array)

    矩阵只是二维的向量,数组可以是多维的向量

    (8)因子(factor)

    R记录向量中的唯一值,每一个唯一值称为相关联因子的水平,参照5.5

    因子两个关键应用:分类变量、分组

    (9)数据框

    旨在模拟数据集,与SAS或SPSS中数据集

    5.2 对向量添加数据

    > v <—c(1,2,3)

    > v <—c(v, 4)             //把4加入原向量为:1,2,3,4

    > w <—c(5,6,7,8)

    > v <—c(v,w)             //将v和w合并

    5.3 在向量中插入数据

    > append(vec,newvalues, after=n)              //在vec中的第n个元素后面插入newvalues

    5.4 理解循环规则

    当较短的向量处理完所有元素,而较长的向量仍有未处理元素,较短向量返回到开始位置循环各元素

    5.5 构建因子

    因子由各分类变量组成,每个分类变量的可能值称为一个水平

    > f <—factor(v)

    5.6 创建列表

    > lst <—list(0.5,0.8,0.3)

    > lst <—list(mid=0.5, right=0.8, left=0.3)

    > lst[[2]]

    >lst[[“mid”]]       或lst[“mid”]              或lst$mid

    5.7 从列表中移除元素

    > lst[[“mid”]]<— NULL           //移除mid元素

    5.8 将列表转换为向量

    > v <—unlist(lst)

    5.9 从列表中移除取值为NULL的元素

    > lst[sapply(lst,is.null)] <— NULL

    5.10 使用条件来移除列表元素

    > lst[lst< 0] <— NULL                     //移除小于0的元素

    >lst[is.na(lst)] <— NULL          //移除值为NA的元素

    > lst[abs(unlist(lst))< 1]

    5.11 矩阵初始化

    > mat <—matrix(vec, 2, 3)            //从vec数据生成一个2*3的矩阵

    > dim(vec)<— c(2,3)                      //方法2

    5.12 矩阵运算

    > t(A)                   //矩阵A的转置

    > solve(A)            //矩阵A的求逆

    > A %*% B           //矩阵A*B

    > diag(n)              //生成一个n阶对角单位矩阵

    5.13 将描述性名称赋给矩阵的行和列

    > rownames(mat)<— c(“rowname_1”, “rowname_2”, …, “rowname_n”)

    > colnames(mat)<— c(“colname_1”, “colname_2”, …, “colname_n”)

    5.14 从矩阵中选定一行或一列

    > vec <—mat[1,]                     //结果是一个向量

    > vec <—mat[,2 ,drop=FALSE]                     //结果是一个矩阵

    5.15 用列数据初始化数据框

    > dfrm <—data.frame(v1, v2, v3, f1, f2)            //用向量和因子初始化数据框

    > lst <—list(v1, v2, v3)

    > dfrm <—as.data.frame(lst)                             //方法2

    5.16 用行数据初始化数据框

    当每行的数据是由数字、字符等不同模式数据混合时,不能用向量存储数据。一般将每一行存储在一个单行数据框中,然后组成一个列表,调用函数rbind和do.call把多行结合成一个大数据框。

    > obs <—list(data.frame(vc1=1, f1=0), data.frame(vc1=2, f1=1))

    > dfrm <—rbind(obs[[1]], obs[[2]])                    //将前两行组成一个数据框

    > dfrm <—do.call(rbind, obs)                      //将所有行组成一个数据框

    当obs不是数据框的列表,而是列表的列表,先调用Map函数将行数据转换成数据框数据,然后再用do.call

    > dfrm <—do.call(rbind, Map(as.data.frame, obs))

    5.17 添加行至数据框

    新行得是单行数据框模式的。

    > suburbs<— rbind(suburbs,

    +                   data.frame(city=”Nanjing”,county=”Kane”, pop=5421)

    +                   data.frame(city=”Beijing”,county=”Jane”, pop=5552))    //同时加两行

    5.18 预分配数据框

    当数据量很大时候,逐个添加新行构建数据框时,R的内存管理器会不良运转。如果知道必须的行数,可以预先分配空间。

    > N <—100000

    > dfrm <—data.frame(colname1=numeric(N), colname2=character(N), …)

    5.19选中数据框的列

    > dfrm[[n]]                        //返回第n列,一个向量

    > dfrm[n]                           //返回一个数据框,里面只有第n列

    >dfrm[c(n1,n2,n4)]          //

    > dfrm[,n]                          //返回一个向量

    >dfrm[,c(n1,n3)]              //

    > dfrm[[“name”]]             > dfrm$name             //返回列名为name的列

    > subset(dfrm,select=c(colname1, colname2))  //按列名选取列

    >subset(dfrm, select=c(colname1, colname2), subset=(colname1>0))              //满足条件的行,以及只要两列

    5.20 修改数据框的列名

    > colnames(dfrm)<— c(“before”, “treatment”, “after”)

    5.21 编辑数据框

    > temp <—edit(dfrm)

    > dfrm <—temp                      //将修改后的数据框存为temp

    > fix(dfrm)                                //直接修改后覆盖原数据框

    5.22 从数据框中移除包含NA的行

    > clean_dfrm<— na.omit(dfrm)

    5.23 从数据框中移除列

    > subset(dfrm,select = -colname2)

    5.24 合并两个数据框

    当两个数据框的列不一致时,合并是横向的,用cbind:

    > all.cols <—cbind(dfrm1, dfrm2)        //横向列合并

    当两个数据框的列一致时,合并是纵向的,用rbind:

    > all.rows <—rbind(dfrm1, dfrm2)              //纵向行合并

    根据共有列合并数据框,类似SQL的join,用merge:

    > m <—merge(dfrm1, dfrm2, by=”name”)

    5.25 更便捷地访问数据框内容

    当用数据框中的列时,本来需要dfrm$colname1,可以用如下命令省去dfrm:

    > with(dfrm,expr)            //当前表达式expr中可以直接用colname1

    >attach(dfrm)                  //下面的表达式中都可以用colname1

    5.26 基本数据类型间的转换

    >as.character(x)        //字符型

    >as.complex(x)          //复数型

    >as.numeric(x)          or           as.double(x)

    >as.integer(x)

    >as.logical(x)

    5.27 不同结构化数据类型间的转换

    有些转换是不可行的,要注意。

    >as.data.frame(x)

    > as.list(x)

    >as.matrix(x)

    > as.vector(x)

     
     
  • 相关阅读:
    榨干PHP性能的使用细节
    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
    Oracle 表锁处理总结
    Windows安装NodeJS
    RedHed5.8 重装yum
    linux Redhat5.8 升级 openSLL 无法升级成功,解决办法
    idea安装详情
    Linux升级OpenSSH 和 OpenSSL 详细步骤
    Oracle dmp文件 exp导出,imp导入
    redis哨兵模式增加密码认证
  • 原文地址:https://www.cnblogs.com/peizhe123/p/5882645.html
Copyright © 2020-2023  润新知