上节我们简单介绍了Dataframe的定义,这节我们具体来看一下Dataframe的操作

首先,数据框的创建函数为 data.frame( ),参考R语言的帮助文档,我们来了解一下data.frame( )的具体用法:

  1. Usage
  2. data.frame(..., row.names = NULL, check.rows = FALSE,
  3. check.names = TRUE, fix.empty.names = TRUE,
  4. stringsAsFactors = default.stringsAsFactors())
  5. default.stringsAsFactors()
  6. Arguments
  7. ... :these arguments are of either the form value or tag = value. Component names are created based on the tag (if present) or the deparsed argument itself.
  8. row.names :NULL or a single integer or character string specifying a column to be used as row names, or a character or integer vector giving the row names for the data frame.

当然,后面还有很多参数的具体用法,在此不做一一赘述,主要用到的就是前两个。首先,“...”代表了表格数据,就是要构成数据框的数据主体,row.names( )为要构成数据框的行名,那么既然数据框相当于R语言的一个表格,应该既有行名也有列名才对,那么列名又是如何给出的呢?我们知道,很多的数据处理软件以及算法是以数据的列为单位进行的,之前我们构建矩阵的时候,默认也是按列填充(byrow=FALSE),而列名在创建数据框开始我们就已经确定好了的。详见下面代码:

我想要创建一个名为“mydataframe”的数据框,首先确定数据框里面的列有哪些,然后调用函数data.frame( )函数

  1. > C1 <-c(1,2,3,4)
  2. > C2 <-c(5,6,7,8)
  3. > C3 <-c(9,10,11,12)
  4. > C4 <-c(13,14,15,16)
  5. > C5 <-c(17,18,19,20)
  6. > mydataframe <- data.frame(C1,C2,C3,C4,C5,row.names = c("R1","R2","R3","R4"))
  7. > mydataframe
  8. C1 C2 C3 C4 C5
  9. R1 1 5 9 13 17
  10. R2 2 6 10 14 18
  11. R3 3 7 11 15 19
  12. R4 4 8 12 16 20

由此可见,数据框是把现有的列拼接成一个表格的一种数据结构,细心的朋友会发现,这个数据框怎么跟上节我们讲过的矩阵长得那么一样!!!再回顾一下上节的矩阵创建:

  1. > mydata <- c(1:20)
  2. > cnames <- c("C1","C2","C3","C4","C5")
  3. > rnames <- c("R1","R2","R3","R4")
  4. > myarray <- matrix(mydata,nrow = 4,ncol = 5,dimnames = list(rnames,cnames))
  5. > myarray
  6. C1 C2 C3 C4 C5
  7. R1 1 5 9 13 17
  8. R2 2 6 10 14 18
  9. R3 3 7 11 15 19
  10. R4 4 8 12 16 20

确实,从长相上来说分不出差别,但是矩阵里面的元素必须一致,而数据框可以是各种类型数据的集合这种集合不是无条件乱七八糟的集合,而是以列为单位,不同列的元素类型可以不同,但是同一列的元素类型必须一致。因此,矩阵可以看做特殊的数据框类型那么这么做有什么意义呢?在数据统计中,我们需要有各种各样类型的数据,就拿简单的成绩单来说,就包含了“姓名”,“学号”,“科目”等字符型元素,也包括“分数”等数值型元素,还有“是否通过”等布尔型元素,因此,从广泛意义上来说,dataframe更具有普适性,矩阵多用在数学计算中。说归说,我们来实际创建一个数据框,然后再演示一下它的具体操作:

  1. > names <- c("小明","小红","小兰")
  2. > StudentID <- c("2014","2015","2016")
  3. > subjects <- c("英语","英语","英语")
  4. > scores <- c(87,98,93)
  5. > Result <- data.frame(StudentID,names,subjects,scores)
  6. > Result
  7. StudentID names subjects scores
  8. 1 2014 小明 英语 87
  9. 2 2015 小红 英语 98
  10. 3 2016 小兰 英语 93

由上可见,当没有给数据框指定行名的时候,系统会默认从1开始给每行一个行号,这跟Excel表格有点类似。 还是同往常一样,我们先学习dataframe数据类型的基本操作

数据框元素的访问:既然矩阵是特殊的数据框,那么矩阵元素的访问方式应该也同样适用于dataframe吗?不是这样,我们知道,数据框是以行或者列为单位(行列可以转置),因此访问元素时只能整行或者整列访问。即dataframe[1,](访问第一行),dataframe[,1](访问第一列)采用这种方式访问列时,返回值是按行排列的形式。访问列同样也可以直接使用dataframe(1)访问第一列,或者dataframe(列名)来访问指定的列。也可以连续访问若干列,详见代码:

  1. > Result[1,] #访问第一行
  2. StudentID names subjects scores
  3. 1 2014 小明 英语 87
  4. > Result[,1] #访问第一列
  5. [1] 2014 2015 2016
  6. Levels: 2014 2015 2016
  7. > Result[1] #访问第一列
  8. StudentID
  9. 1 2014
  10. 2 2015
  11. 3 2016
  12. > Result["names"] #访问指定标号的列
  13. names
  14. 1 小明
  15. 2 小红
  16. 3 小兰
  17.  
  18. > Result[1:3,]  #访问1-3行
  19. StudentID names subjects scores
  20. 1 2014 小明 英语 87
  21. 2 2015 小红 英语 98
  22. 3 2016 小兰 英语 93
  23. > Result[1:3]  #访问1-3列
  24. StudentID names subjects
  25. 1 2014 小明 英语
  26. 2 2015 小红 英语
  27. 3 2016 小兰 英语
  28. > Result[c(1,3),]  #只访问1,3行,注意写法 c( )
  29. StudentID names subjects scores
  30. 1 2014 小明 英语 87
  31. 3 2016 小兰 英语 93
  32. > Result[c(1,4)]  #只访问1,4列,注意写法 c( )
  33. StudentID scores
  34. 1 2014 87
  35. 2 2015 98
  36. 3 2016 93
  37. > Result[c("names","scores")]  #只访问names和scores列,注意写法 c( )
  38. names scores
  39. 1 小明 87
  40. 2 小红 98
  41. 3 小兰 93

由上可得:对数据框操作,必须以向量为单位,使用c( ) or list( ),通过上述了解,我们发现,普通的访问必须带着行名和列名,这有的时候给我们带来不必要的麻烦,比如我要计算成绩平均值,带上列名Score会给我们带来一些困惑,于是有哪些方法可以在访问数据库元素时不带着行名或者列名呢?

方法一:用attach和detach函数,比如要打印所有names,那么可以写成:

  1. > attach(Result)
  2. The following objects are masked _by_ .GlobalEnv:
  3. names, scores, StudentID, subjects
  4. The following objects are masked from Result (pos = 3):
  5. names, scores, StudentID, subjects
  6. > name <- names
  7. > score <-scores
  8. > detach(Result)
  9. > name
  10. [1] "小明" "小红" "小兰"
  11. > score
  12. [1] 87 98 93
  13. > mean(score)
  14. [1] 92.66667

方法二:用with函数

  1. > with(Result,{score <- scores})
  2. > score
  3. [1] 87 98 93

上面谈到了dataframe的创建和读取,如果我需要添加或者删除某一列该怎么办呢?

  1. > Result$age<-c(12,14,13)  #添加age列
  2. > Result
  3. StudentID names subjects scores age
  4. 1 2014 小明 英语 87 12
  5. 2 2015 小红 英语 98 14
  6. 3 2016 小兰 英语 93 13
  1. > Result2 <- Result[-2]  #删除name列
  2. > Result2
  3. StudentID subjects scores age
  4. 1 2014 英语 87 12
  5. 2 2015 英语 98 14
  6. 3 2016 英语 93 13

如果我需要查询成绩等于98的学生的信息该怎么办呢?

  1. > Result[which(Result$scores==98),]
  2. StudentID names subjects scores age
  3. 2 2015 小红 英语 98 14

上面说过了,矩阵和数据框也是两种不同的数据类型,我们知道数据类型之间可以互相转换,用is.***( )可以判断某个变量是否为***类型,用as.***( )则将某个变量转换为***类型。那么相应的,矩阵转换为数据框类型则应为:

  1. > myarray
  2. C1 C2 C3 C4 C5
  3. R1 1 5 9 13 17
  4. R2 2 6 10 14 18
  5. R3 3 7 11 15 19
  6. R4 4 8 12 16 20
  7. > myarrayframe <- as.data.frame(myarray)
  8. > myarrayframe
  9. C1 C2 C3 C4 C5
  10. R1 1 5 9 13 17
  11. R2 2 6 10 14 18
  12. R3 3 7 11 15 19
  13. R4 4 8 12 16 20
  14. > is.data.frame(myarray)
  15. [1] FALSE
  16. > is.data.frame(myarrayframe)
  17. [1] TRUE

跟矩阵matrix操作一样,数据框也有rbind和cbind函数,用法大致相同,有兴趣的朋友可以简单联系一下,这里不再赘述。

最后,我们来谈一下数据框数据处理操作:

上面我们讲到,利用dataframe[ 列号 ]或者dataframe[ 列值 ]可以读取数据框的某一列,返回值仍为数据框类型,但是这部分数据不方便直接利用我们之前讲过的求和,求平均值等方法进行计算分析,因为读取的数据带有“行名/列名”,这个为字符型变量。有的人会问,我在创建数据框的时候,不加行名和列名不就行了?第一,在创建数据框的时候,会默认给你分配行名或者列名,第二,就算不分配行名或者列名,那数据框创建起来还有什么意义?

  1. > mydataframe
  2. C1 C2 C3 C4 C5
  3. R1 1 5 9 13 17
  4. R2 2 6 10 14 18
  5. R3 3 7 11 15 19
  6. R4 4 8 12 16 20
  7. > mydataframe["C4"]
  8. C4
  9. R1 13
  10. R2 14
  11. R3 15
  12. R4 16
  13. > mean(mydataframe["C4"])
  14. [1] NA
  15. Warning message:
  16. In mean.default(mydataframe["C4"]) : 参数不是数值也不是逻辑值:回覆NA
  17. > is.data.frame(mydataframe["C4"])
  18. [1] TRUE

方法一:将数据框格式重新转化为矩阵格式,然后按照矩阵索引的方式来找寻要处理的数据组,利用矩阵或者向量中相关函数来进行一定的数据处理。

  1. > myarray2 <- as.matrix(mydataframe)
  2. > is.matrix(myarray2)
  3. [1] TRUE
  4. > myarray2
  5. C1 C2 C3 C4 C5
  6. R1 1 5 9 13 17
  7. R2 2 6 10 14 18
  8. R3 3 7 11 15 19
  9. R4 4 8 12 16 20
  10. > x <- myarray[,3] #读取第3列的值
  11. > x
  12. R1 R2 R3 R4
  13. 9 10 11 12
  14. > is.vector(x) #查看x是否为向量类型
  15. [1] TRUE
  16. > mean(x)
  17. [1] 10.5
  18. > sum(x)
  19. [1] 42

方法二:在读取数据框列的时候换用另外一种方法,dataframe$(行名或者列名),返回值是vector类型

  1. > c <- mydataframe$C3
  2. > c
  3. [1] 9 10 11 12
  4. > is.vector(c)
  5. [1] TRUE
  6. > mean(c)
  7. [1] 10.5
  8. > sum(c)
  9. [1] 42

同时,也可以利用dataframe$(新的列名) <- 新的向量,来给dataframe添加新的列,具体操作如下:

  1. > mydataframe$sum <- mydataframe$C1 +mydataframe$C4
  2. > mydataframe$mean <- (mydataframe$C1+mydataframe$C4)/2
  3. > mydataframe
  4. C1 C2 C3 C4 C5 sum mean
  5. R1 1 5 9 13 17 14 7
  6. R2 2 6 10 14 18 16 8
  7. R3 3 7 11 15 19 18 9
  8. R4 4 8 12 16 20 20 10

最推崇的是下一种方法,直接利用transform函数组建新的数据框,具体用法如下:

  1. > x1 <- mydataframe$C1
  2. > x2 <- mydataframe$C3
  3. > mydataframe2 <- transform(mydataframe,sum2=x1+x2,mean2=(x1+x2)/2)
  4. > mydataframe2
  5. C1 C2 C3 C4 C5 sum mean sum2 mean2
  6. R1 1 5 9 13 17 14 7 10 5
  7. R2 2 6 10 14 18 16 8 12 6
  8. R3 3 7 11 15 19 18 9 14 7
  9. R4 4 8 12 16 20 20 10 16 8

R 语言的Dataframe常用操作的更多相关文章

  1. R语言 入门知识--常用操作和例子

    1 R的下载.安转   (转)R有很多的版本,支持目前主流的操作系统MAC.Linux和WINDOWS系列.因为我个人是在WINDOWS下用R的,所以在这里将只介绍WINDOWS下R的下载&安 ...

  2. R语言文件相关的操作

    1. 文件系统介绍 R语言对文件系统的操作,包括文件操作和目录操作,函数API都定义在base包中. 2. 目录操作 2.1 查看目录 查看当前目录下的子目录. # 启动R程序 ~ R # 当前的目录 ...

  3. R语言之数据处理常用包

    dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口:tidyr包的作者是Hadley ...

  4. r语言与dataframe

    什么是DataFrame 引用 r-tutor上的定义: DataFrame 是一个表格或者类似二维数组的结构,它的各行表示一个实例,各列表示一个变量. 没错,DataFrame就是类似于Excel表 ...

  5. R语言进行文件夹操作示例(转)

    rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A& ...

  6. R语言把DataFrame的一行变成向量

    在R语言里面,DataFrame的一列数据本质上可以认为是一个向量或列表,但是一行数据不是. 今天有一个31列的数据集,由于放在第一行的变量名格式不规范,读入数据的时候不能顺带读入变量名.于是跳过首行 ...

  7. pyspark dataframe 常用操作

    spark dataframe派生于RDD类,但是提供了非常强大的数据操作功能.当然主要对类SQL的支持.   在实际工作中会遇到这样的情况,主要是会进行两个数据集的筛选.合并,重新入库.   首先加 ...

  8. Pandas 之 DataFrame 常用操作

    import numpy as np import pandas as pd This section will walk you(引导你) through the fundamental(基本的) ...

  9. R语言描述性统计常用函数

随机推荐

  1. git使用相关记录

    上传github操作记录:https://blog.csdn.net/pql925/article/details/72772660 git提交仓库相关:https://blog.csdn.net/M ...

  2. vuex 管理vue-router的传值

    假设有这样的一种情况,在两个组件中.一个组件[A]主要是比如说放表格数据,而另外一个组件[B]是专门用来向组件A的表格添加数据的表单.这个时候就是两个兄弟组件之间传递数据了.首先想到的是使用兄弟组件传 ...

  3. 高性能JavaScript(数据存取)

    数据存取分为4各部分 存取位置 作用域及改变作用域 原型以及原型链 缓存对象成员值 存取位置 JavaScript 有4中基本的数据存取位置 字面量:字面量代表自身,不存于特定的位置.比如这个的匿名函 ...

  4. AngularJS学习之 ui router

    1.安装 bower install --save angular_ui-router 2.在项目主页面 index.html中添加 <div ui-view="">& ...

  5. SD配置步骤清单

    定义销售组织 定义分销渠道 定义产品组 给公司代码分配销售组织 给销售组织分配销售渠道 给工厂分配销售组织.分销渠道 给销售组织分配产品组 定义销售范围 定义装运点 给工厂分配装运点 维护工厂的装运点 ...

  6. 解决Python 爬取ssh证书 的报错问题

    Python3 中会要求添加信任证书,但只是进行爬取数据就没必要了,我们可以忽略它 r1 =requests.get("https://www.baidu.com", verify ...

  7. SVN CentOS7 下配置svn的安装及基础配置介绍

    CentOS7 下配置svn的安装及基础配置介绍 by:授客 QQ:1033553122 目录 一. 二. 三. 四. 五. 六. 七. 一.      实践环境 CentOS 7操作系统(CentO ...

  8. 如何获取listview里面的edittext或者RadioGroup的值,涉及到引发的混乱现象

    最近要实现从数据库读数据,该数据对应listview的item布局里面的RadioButton值,并且item布局里面还有EditText的控件. 如何将每一条对应的listview对应值获取出来呢? ...

  9. 常用内置方法之:__str__,__repr__

    class Test(object): def __init__(self): pass def __str__(self): return "test" test = Test( ...

  10. SQL Server全文搜索

    SQL Server全文搜索 看这篇文章之前请先看一下下面我摘抄的全文搜索的MSDN资料,基本上MSDN上关于全文搜索的资料的我都copy下来了 并且非常认真地阅读和试验了一次,并且补充了一些SQL语 ...