R_认识数据集

作者: 睡不醒的小灰灰 | 来源:发表于2018-04-14 21:47 被阅读0次

写在前面

本人研究生在读,利用一些零碎的时间,学习R,分享学习摘抄笔记的目的:

  • 为了防止三天打鱼,两天晒网,激励自己学习下去。
  • 作为菜鸟,学习中难免有些疑问,帮助别人,帮助自己。
  • 方便将来自己查阅。
  • 认识些朋友,生活更有趣些。
    如有问题,欢迎指正,毕竟是一个提升自我的过程。

数据集

数据分析的第一步就是按照个人要求,创建含有研究信息的数据集。R中,这个任务分为两步:

  • 选择一种数据结构来储存数据
  • 将数据输入或导入到数据结构中
    什么是数据集?数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。
    R中的数据结构

向量

向量是用于储存数值型,字符型或逻辑数据的一维数组。用函数从c( )来创建向量,如下:
a <- c(1,2,3,4,0,-1,-2)
b <- c("one","two","three")
c <- c(TRUE,FALSE,FALSE,TURE)
注意:同一向量中无法混杂其它模式的元素,并且,我们可以利用下列命令获取相应的元素。

> a <- c(1,2,3,4,0,-1,-2)
> a []
[1]  1  2  3  4  0 -1 -2
> a [3]
[1] 3
> a [c(2:5)]
[1] 2 3 4 0

矩阵

矩阵是一个二维数组,每个元素有一个相同的模式(数值型、字符型或逻辑型),可以通过函数matrix来创建矩阵。一般格式如下:

Joshmatrix <- matrix(vector,    #包含了矩阵的元素
                     nrow=number_of_rows,ncol=number_of_columns,     #nrow和ncol指定行和列的维数
                     byrow=logical_value     #表明矩阵按列填充(byrow=FALSE)还是按行填充(byrow=TRUE),默认按列填充。
> y <- matrix(1:20,nrow = 5,ncol = 4)    #创建一个5行4列的矩阵,默认按列填充。
> y
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> cells <- c(1,26,21,65)
> rnames <- c("R1","R2")
> cnames <- c("C1","C2")
> mymatrix <- matrix(cells,nrow = 2,ncol = 2,byrow = TRUE,dimnames = list(rnames,cnames))    #创建了2行2列含行名列名标签的矩阵,并按行填充
> mymatrix
   C1 C2
R1  1 26
R2 21 65
> mymatrix[1,]    #矩阵下标的使用
C1 C2 
 1 26 
> mymatrix[,2]
R1 R2 
26 65 
> mymatrix[1,2]
[1] 26

数组

数组(array)的维度可以大于2,可以利用函数array( )创建。

myarray <- array(vector    #包含数组中的数据  
                 dimensions    #数值型向量,给出各维度下标的最大值
                 dimnames    #可选的、各维度名称标签列表)
> dim <- c("A1","A2")
> dim2 <- c("B1","B2","B3")
> dim3 <- c("C1","C2","C3","C4")
> z <- array(1:24,c(1,2,3),dimnames = list(dim,dim2,dim3))
Error in array(1:24, c(1, 2, 3), dimnames = list(dim, dim2, dim3)) : 
  length of 'dimnames' [1] not equal to array extent
> z <- array(1:24,c(2,3,4),dimnames = list(dim,dim2,dim3))    #一个创建三维(2×3×4)数值型数组
> z
, , 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
> z[1,2,2]    #选取元素
[1] 9

数据框

由不同的列可以包含不同模式(数值型、字符型等)的数据组成。数据框可通过函数data.frame( )创建。

mydata <- data.frame(col1,col2,col3,...)    #列向量col1,col2,col3,...可以为任何类型(字符型、数值型或逻辑型)

利用数据框图示列表完成。

病人数据
> PatientID <- c(1,2,3,4)
> AdmDate <- c(10/15/2009,11/01/2009,10/21/2009,10/28/2009)
> Age <- c(25,34,28,52)
> Diabetes <- c(Type1,Type2,Type1,Type1)
Error: object 'Type1' not found
> Diabetes <- c(Type1,Type2,Type1,Type1)
Error: object 'Type1' not found
> Diabetes <- c("Type1","Type2","Type1","Type1")    # 感觉新手经常犯的错误,比如我,**字符型加引号**
> Status <- c("Poor","Improved","Excellent","Poor")
> Patientdata <- data.frame(PatientID,AdmDate,Age,Diabetes,Status)
> Patientdata    #并非自己预期的结果
  PatientID      AdmDate Age Diabetes    Status
1         1 0.0003318401  25    Type1      Poor
2         2 0.0054753609  34    Type2  Improved
3         3 0.0002370286  28    Type1 Excellent
4         4 0.0001777715  52    Type1      Poor
> AdmDate <- c("10/15/2009","11/01/2009","10/21/2009","10/28/2009")
> Patientdata    #需重新运行一下,不然就是这样的结果
  PatientID      AdmDate Age Diabetes    Status
1         1 0.0003318401  25    Type1      Poor
2         2 0.0054753609  34    Type2  Improved
3         3 0.0002370286  28    Type1 Excellent
4         4 0.0001777715  52    Type1      Poor
> Patientdata <- data.frame(PatientID,AdmDate,Age,Diabetes,Status)
> Patientdata    #成功!
  PatientID    AdmDate Age Diabetes    Status
1         1 10/15/2009  25    Type1      Poor
2         2 11/01/2009  34    Type2  Improved
3         3 10/21/2009  28    Type1 Excellent
4         4 10/28/2009  52    Type1      Poor

小track:倘若每次调取如上Patientdata中的元素时,每次都要输入数组的名称,会有些麻烦,这里可以利用函数attach()与detach();with()以减少输入,并使其看起来简洁。

> attach(Patientdata)    #将数据框添加到R的搜索路径中
The following objects are masked _by_ .GlobalEnv:    #这里,出现了mask,即这个数据框的一些变量与环境变量发生重复,且原始对象有优先权。这时用函数with()会好一点。

    AdmDate, Age, Diabetes, PatientID, Status

> with(Patientdata,{
+ c(PatientID,Age,Status)
+ })
 [1]  1  2  3  4 25 34 28 52  3  2  1  3    #这里的Status显示的结果,并没有看明白,看起来默认的给我排了个序。存疑
  • 因子
    变量可以分为名义型、有序型和连续型变量。
> Patientdata
  PatientID    AdmDate Age Diabetes    Status
1         1 10/15/2009  25    Type1      Poor
2         2 11/01/2009  34    Type2  Improved
3         3 10/21/2009  28    Type1 Excellent
4         4 10/28/2009  52    Type1      Poor

图中所示,Diabetes 为名义型变量,即没有顺序之分。Status为有序型变量,有顺序之分,如病人状态的好坏,但是这里我们不知道,病人状态好坏具体相差多少。而Age和AdmData是连续型变量,它可以为我们呈现某个范围的任意值,有顺序,有数量。
我们将名义型(类别)变量和有序型(有序类别)称为因子。 #为什么要搞个因子的感念?
针对名义型(类别)变量,可用factor()函数进行赋值,具体复制根据字母顺序而定。

> Diabetes <-factor(Diabetes)    
> Diabetes
[1] Type1 Type2 Type1 Type1
Levels: Type1 Type2
> str(Diabetes)
 Factor w/ 2 levels "Type1","Type2": 1 2 1 1    #可以看到变化,内部关联为1=Type1,2=Type2

而对于有序型变量,需要函数factor()指定参数ordered=TURE:

> Status <- factor(Status,ordered = T)
> Status
[1] Poor      Improved  Excellent Poor     
Levels: Excellent < Improved < Poor    #默认按照字母顺序排列,恰好和逻辑顺序一致
> str(Status)
 Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
     ##若逻辑顺序和字母顺序不一致,可用level选项覆盖默认排序
 > A <- c("Ailing","Improved","Excellent","Ailing")
> A <- factor(A,ordered = T)
> A
[1] Ailing    Improved  Excellent Ailing   
Levels: Ailing < Excellent < Improved
> str(A)
 Ord.factor w/ 3 levels "Ailing"<"Excellent"<..: 1 3 2 1
 > str(Patientdata)    #函数str(object)可提供R中某个对象(本例中为数据框)的信息。它清楚地显示diabetes是一个因子,而status是一个有序型因子,以及此数据框在内部是如何进行编码的。
'data.frame':   4 obs. of  5 variables:
 $ PatientID: num  1 2 3 4
 $ AdmDate  : Factor w/ 4 levels "10/15/2009","10/21/2009",..: 1 4 2 3
 $ Age      : num  25 34 28 52
 $ Diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
 $ Status   : Factor w/ 3 levels "Excellent","Improved",..: 3 2 1 3
 
> summary(Patientdata)    #函数summary()会区别对待各个变量。它显示了连续型变量age的最小值、最大值、均值和各四分位数,并显示了类别型变量diabetes和status(各水平)的频数值。
   PatientID          AdmDate       Age         Diabetes       Status 
 Min.   :1.00   10/15/2009:1   Min.   :25.00   Type1:3   Excellent:1  
 1st Qu.:1.75   10/21/2009:1   1st Qu.:27.25   Type2:1   Improved :1  
 Median :2.50   10/28/2009:1   Median :31.00             Poor     :2  
 Mean   :2.50   11/01/2009:1   Mean   :34.75                          
 3rd Qu.:3.25                  3rd Qu.:38.50                          
 Max.   :4.00                  Max.   :52.00 

列表

列表中是R数据类型中比较复杂一种。一般来说,列表是一些对象的有序集合。如某个列表中含有 若干向量,矩阵,数据框,甚至其他列表的组合。可用函数list( )创建列表

> 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"

> mylist[[2]]    #获取其中的元素
[1] 25 26 18 39
> mylist[["ages"]]
[1] 25 26 18 39

数据的输入

R可从键盘、文本文件、Microsoft Excel和Access、流行的统计软件、特殊格式的文件,以及多种关系型数据库中导入数据。由于作为菜鸟的自己并未真正实战过,故此主要介绍从键盘,带分隔符的文本文件,Excel文件和网页中抓入的数据导入R中。

键盘输入

若要从键盘中输入数据到R,则需要一下步骤:
* 创建一个空数据框(矩阵),其变量和变量的模式需要与理想中的最终数据一致;
* 针对这个数据对象,调用文本编辑器(函数edit( )),输入的你数据,并将结果保存回此数据结构中。

> mydata <- data.frame(age = numeric(0),    #建一个名为mydata的表格,包含age(数值型),gender(字符型),weight(数值型)。类似于numeric(0)的赋值语句,将创建一个指定的模式,但不含实际数据的变量
+ gender = character(0),weight = numeric(0))
> mydata <- edit(mydata)    #有一个如下的表格
window系统中生成的可以键入的表格

带分隔符的文本文件

使用函数read.table( )从带分隔符的文本文件中导入数据,它可读入一个表格格式的文件并将其保存为一个数据框。

> mydataframe <- read.table(file,header = logical_value,    #file是一个带分隔符的ASCⅡ文本文件,header是一个表明首行是否包含了变量的逻辑值(T或F)
+ sep = "delimiter",row.name = "name")    #sep用来指定分割数据的分隔符,row.names是一个可选的参数,用于一个或多个表示行标识的变量。

我就做了一波尝试,看看具体怎么用。先找了一个excel文件,将其导出为一个逗号文件(csv)。将该逗号文件放置自己当前R中的工作目录中,使用下面命令操作。

> getwd()    #获取当前工作目录
[1] "C:/Users/Josh/Documents"
> students <- read.table("students.csv",header = T,sep = ",")    #参数sep允许你导入那些使用逗号以外的符号来分隔行内数据的文件。你可以使用sep="\t"读取以制表符分隔的文件。此参数的默认值为sep="",即表示分隔符可为一个或多个空格、制表符、换行符或回车符
> students
                  学院    班级        学号       考生号   姓名
                  ##有具体数字内容,不方便给大家看了。

摘自《R语言实战》一书

相关文章

  • R_认识数据集

    写在前面 本人研究生在读,利用一些零碎的时间,学习R,分享学习摘抄笔记的目的: 为了防止三天打鱼,两天晒网,激励自...

  • R_数据集

    数据集 在R中按照个人要求的格式来创建含有研究信息的数据集包括以下两步: 选择一种数据结构来存储数据; 将数据...

  • R_数据框

    生成矩阵的方法 ···· R x=c(1,4,5,23,5,7,6)x[1] 1 4 5 23 5 7...

  • R_数据处理_basic

    数据结构 数据结构:向量、矩阵、数组、数据框、因子、列表 向量 用于储存数值型、字符型或逻辑性数据的一维数组。同一...

  • 认识CIFAR-10数据集

    CIFAR-10是一个广泛使用的标准数据集,里面包含了各种阿猫阿狗阿汽车……为了在后续学习实验中用好它,首先需要认...

  • SAS中的数据清洗

    1.数据合并 (1)利用set语句纵向合并 data数据集; set数据集1(数据集选项)数据集2(数据集选项...

  • sklearn数据集的获取与划分

    划分数据集 获取sklearn本地的数据集 描述iris数据集 从网络获取数据集 网络获取 划分训练集和测试集 数...

  • Fastone-集群数据集管理+导入导出+aksk

    1集群数据集管理 1.1新增数据集 1.2绑定数据集 1.3查看指定数据集 1.4查看当前用户下的所有数据集 1....

  • 机器学习算法实现(十):Apriori

    Apriori算法R语言实践 数据集 采用arules包中的Adult数据集。 Adult数据集属于事务型数据集。...

  • 基于Keras实现Kaggle2013--Dogs vs. Ca

    【下载数据集】 下载链接--百度网盘关于猫的部分数据集示例 【整理数据集】 将训练数据集分割成训练集、验证集、测试...

网友评论

    本文标题:R_认识数据集

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