R002 数据结构

作者: caoqiansheng | 来源:发表于2020-06-12 11:26 被阅读0次

    1.思维导图

    R语言数据结构

    2.定义

    • 2.1 对象(object)
      指可以赋值给变量的任何事物,包括常量、数据结构、函数,甚至图形。对象都拥有某种模式,描述了此对象是如何存储的,以及某个类,像print这样的泛型函数表明如何处理此对象。
    • 2.2 数据框(data frame)
      R中用于存储数据的一种结构:列表示变量,行表示观测。在同一个数据框中可以存储不同类型(如数值型、字符型)的变量。

    3 R数据存储结构

    3.1 向量:函数c()

    向量是储存数值型,字符型或逻辑型的一位数组,单个向量中的数据必须拥有相同类型的模式,执行组合功能的函数c()可用来创建向量。各类向量如下例所示:

    a <- c(1,2,3,4,5,6)
    b <- c("one","two","three")
    c <- c(TRUE,TURE,TURE,FALSE,TURE,TURE)​
    
    3.2 矩阵:函数matrix()

    矩阵是一个二维数组,每个元素都拥有相同的模式(数值型,字符型,逻辑型),可通过函数matrix()创建,例如下列代码:

    >cells <- c(1,26,24,28)
    >rnames <- c("R1","R2")​
    >cnames <- c("C​1","C2")​​​
    > ​mymatrix <- matrix(cells,nrow=2,ncol=2,dimnames=list(rnames,cnames),byrow=TRUE)
    > mymatrix   
       C1 C2
    R1  1 26
    R2 24 28​
    

    其中byrow=TRUE,代表矩阵将按列填充,如byrow=FALSE,则按行填充。默认情况下均为按列填充。

    3.3 数组:函数Array()

    数组(array)与矩阵类似,但是维度可以大于2。像矩阵一样,数组中的数据也只能拥有一种模式。数组可通过array()函数创建,形式如下:

    > dim1 <- c("A1","A2")
    >​​ dim2 <- c("B1","B2","B3")
    >​​ dim3 <- c("C1","C2","C3","C4")
    ​​> myarray <- array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))
    > myarray
    ​, , C1   
      B1 B2 B3
    A1  1  3  5
    A2  2  4  6
    , , C2   
      B1 B2 B3
    A1  7  9 11
    A2  8 10 12
    , , C3   
      B1 B2 B3
    A1 13 15 17
    A2 14 16 18
    , , C4   
      B1 B2 B3
    A1 19 21 23
    A2 20 22 24​
    
    3.4 数据框:函数data.frame()

    1.数据框不同列之间数据类型可以不一致,但是单独的列内必须一致
    ​2.由于数据有多种模式,无法将此数据集放入一个矩阵。在这种情况下,可以通过data.frame()函数创建数据框

    ​> patientID <- c(1,2,3,4)
    > age <- c(25,34,28,52)
    > diabetes <- c("Type1","Type2","Type3","Type4")
    > status <- c("Poor","improved","Excellent","Poor")
    > patientdata <- data.frame(patientID,age,diabetes,status)
    > patientdata  
    patientID age diabetes    status
    1         1  25    Type1      Poor
    2         2  34    Type2  improved
    3         3  28    Type3 Excellent
    4         4  52    Type4      Poor
    > patientdata$patientID
    [1] 1 2 3 4​
    

    记号$是用来选取一个给定数据框中的某个特定变量如果想生成糖尿病类型变量diabetes和病情变量status的列联表,可使用以下代码​​

    > table(patientdata$diabetes,patientdata$status)
    Excellent improved Poor  
    Type1         0        0    1  
    Type2         0        1    0  
    Type3         1        0    0  
    Type4         0        0    1​
    

    在每个变量名前都键入一次patientdata$会很繁琐,可以联合使用函数attach()和detach()或单独使用函数with()来简化代码​函数attach()可将数据框添加到R的搜索路径中。R在遇到一个变量名以后,将检查搜索路径中的数据框。​函数detach()将数据框从搜索路径中移除。值得注意的是,detach()并不会对数据框本身做任何处理。这句是可以省略的,但其实它应当被例行地放入代码中,因为这是一个好的编程习惯。​​

    > attach(mtcars)
    > summary(mpg)
    > plot(mpg,disp)
    > plot(mpg,wt)
    > detach(mtcars)
    

    除此之外,另一种方式是使用函数with()​,函数with()的局限性在于,赋值仅在此函数的括号内生效。

    > with(mtcars,{
    print(summary(mpg))
    plot(mpg,disp)
    plot(mpg,wt)
     })
    
    3.5 列表:函数list()

    列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象(或成分,component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。可以使用函数list()创建列表列表成为了R中的重要数据结构。首先,列表允许以一种简单的方式组织和重新调用不相干的信息。其次,许多R函数的运行结果都是以列表的形式返回的​

    > g <- "my First list"
    > h <- c(25,26,18,39)
    > j <- matrix(1:10,nrow=5)
    > k <- c("one","two","three")
    > mylist <- list(title=g,ages=h,j,k)
    > mylist
    $title
    [1] "my First list"
    $ages
    [1] 25 26 18 39
    [[3]]     
    [,1] [,2]
    [1,]    1    6
    [2,]    2    7
    [3,]    3    8
    [4,]    4    9
    [5,]    5   10
    [[4]]
    [1] "one"   "two"   "three"​
    

    4. R处理数据类型

    4.1 数值型(numeric)
    4.2 字符型(character)
    4.3 逻辑型(TRUE/FALSE)
    4.4 因子(factor,也即分类变量)
    • 1.R变量可分为名义型,有序型以及连续型
    • 2.​类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。
    • 3.函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上​
    • 4.对于字符型向量,因子的水平默认依字母顺序创建。​可以通过指定levels选项来覆盖默认排序​
    > status <- factor(status,order=TRUE,levels = c("poor","improved","excellent"))
    ### ​各水平的赋值将为1=Poor、2=Improved、3=Excellent
    
    • 5.数值型变量可以用levels和labels参数来编码成因子
    > sex <- factor(sex,levels = c(1,2),labels = c("male",'female'))
    ​​### ​性别将被当成类别型变量,标签“Male”和“Female”将替代1和2在结果中输出,而且所有不是1或2的性别变量将被设为缺失值。
    
    4.5 复数型(虚数)
    4.6 原生型(字节)

    5. R数据导入方法

    5.1 手工输入:R中的函数edit()会自动调用一个允许手动输入数据的文本编辑器
    > mydata <- data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
    > mydata <- edit(mydata)
    

    语句mydata <- edit(mydata)的一种简捷的等价写法是fix(mydata)​以下代码创建了和之前用edit()函数所创建的一样的数据框。一个字符型变量被创建于存储原始数据,然后read.table()函数被用于处理字符串并返回数据框:

    mydatatxt <- "
    age gender weight
    25 m 166
    30 f 115
    18 f 120
    "
    mydata <- read.table(header = TRUE,text = mydatatxt)
    mydata
    age gender weight
    1  25      m    166
    2  30      f    115
    3  18      f    120​
    
    5.2 外部源导入数据
    • 文本文件
      可以使用read.table()从带分隔符的文本文件中导入数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。表格的每一行分别出现在文件中每一行。其语法如下:
      read.table(file, header = FALSE, sep = "", quote = ""'", dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"), row.names, col.names, as.is = !stringsAsFactors, na.strings = "NA", colClasses = NA, nrows = -1, skip = 0, check.names = TRUE, fill = !blank.lines.skip, strip.white = FALSE, blank.lines.skip = TRUE, comment.char = "#", allowEscapes = FALSE, flush = FALSE, stringsAsFactors = default.stringsAsFactors(), fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)​
      1.file是被读出的数据文件的名称。表中的每一行显示为一行文件,如果不包含绝对路径,则文件名仅对当前工作目录有效,可以使用getwd()查看当前工作路径,使用setwd()更改当前工作路径​
      2.header是一个逻辑型变量,用以表示file的第一行是否包含变量名
      3.sep是分开数据的分隔符,默认是sep=“”,这表示一个或者多个空格,制表符,换行或者是回车。使用sep=“,”用来读取以逗号来分隔行内数据的文件,使用sep=“\t”来读取以制表符分隔行内数据的文件
      4.rownames​​是指一个用于指定一个或者多个行标记符的可选参数
      5.colnames如果数据的第一行不包含变量名(即header=FALSE),可以用colnames指定一个包含变量名的字符变量,如果​header=FALSE,colnames选项被忽略,变量会被分别命名为V,V2……
      6.na.strings​可用于标识缺失值的字符向量,如na.strings​=c(“-9”,“?”)表示将-9和?在读取数据时转换为NA
      7.colClasses可选的分配到每一列的类向量,如​colClasses=c(“numeric”,“numeric”,“character”,“NULL”,“character”)表示前两列读取为数值型向量,第三列读取为字符型向量,跳过第四列,第五烈读取为数值型变量,如果数列多于5列,colClasses的值会循环
      8.quote用于对有特殊字符的字符串划定界限的字符串,默认值是双引号(")或是单引号(')
      ​9.skip读取数据提前跳过的行的数目,一般用来跳过头注释
      10.stringsAsFactors是一个逻辑变量,标记处字符向量是否需要转化成因子,默认值是TRUE,除非它是被colClasses覆盖11.text一个指定文字进行处理的字符串,如果text被设置了,file应该被留空​​​
    • 电子表格
      读取一个Excel文件的最好方式,就是在Excel中将其导出为一个逗号分隔文件(csv),并使用read.table函数读取或者可以使用readxl包进行读取,read_xlsx、read_xls和read_excel参数一样。
      read_excel(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max), progress = readxl_progress(), .name_repair = "unique")
      1.path为工作表的路径
      2.sheet为​字符串(工作表的名称)或整数(工作表的位置),如果两个参数均未指定工作表,则默认为第一张工作表。​​​
      3.range为读取的工作表单元格范围,如“A1:B5”
      4.col_names如果将第一行用作列名,则为TRUE;使用FALSE获取默认名称;或者为每一列指定名称的字符向量。​​​​
      5.col_types
      6.NA​​​​​字符串的字符向量,将其解释为缺失值。默认情况下,readxl将空白单元格视为丢失的数据。
      ​​7.trim_ws是否应修剪开头和结尾的空白
      8.skip在读取任何内容(列名称或数据)之前要跳过的最小行数。前导空行会自动跳过,因此这是一个下限。如果给定范围则忽略。
      9.​​n_max 读取的最大数据行数。尾随的空行会自动跳过
    • 统计软件
      1.IBM SPSS数据集可以通过foreign包中的函数read.spss()导入到R中,也可以使用Hmisc包中的spss.get()函数。函数spss.get()是对read.spss()的一个封装,它可以为你自动设置后者的许多参数
      2.R中设计了若干用来导入SAS数据集的函数,包括foreign包中的read.ssd(), Hmisc包中的sas.get(),以及sas7bdat包中的read.sas7bdat()​
    • 各类数据库管理系统

    参考
    1.卡巴科弗. R语言实战[M]. 人民邮电出版社, 2013.

    相关文章

      网友评论

        本文标题:R002 数据结构

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