热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

r生成新的dataframe_R语言的Dataframe常用操作

上节我们简单介绍了Dataframe的定义,这节我们具体来看一下Dataframe的操作首先,数据框的创建函数为data.frame(),

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

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

Usage

data.frame(..., row.names = NULL, check.rows = FALSE,

check.names = TRUE, fix.empty.names = TRUE,

stringsAsFactors = default.stringsAsFactors())

default.stringsAsFactors()

Arguments

... :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.

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( )函数

> C1

> C2

> C3

> C4

> C5

> mydataframe

> mydataframe

C1 C2 C3 C4 C5

R1 1 5 9 13 17

R2 2 6 10 14 18

R3 3 7 11 15 19

R4 4 8 12 16 20

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

> mydata

> cnames

> rnames

> myarray

> myarray

C1 C2 C3 C4 C5

R1 1 5 9 13 17

R2 2 6 10 14 18

R3 3 7 11 15 19

R4 4 8 12 16 20

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

> names

> StudentID

> subjects

> scores

> Result

> Result

StudentID names subjects scores

1 2014 小明 英语 87

2 2015 小红 英语 98

3 2016 小兰 英语 93

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

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

> Result[1,] #访问第一行

StudentID names subjects scores

1 2014 小明 英语 87

> Result[,1] #访问第一列

[1] 2014 2015 2016

Levels: 2014 2015 2016

> Result[1] #访问第一列

StudentID

1 2014

2 2015

3 2016

> Result["names"] #访问指定标号的列

names

1 小明

2 小红

3 小兰

> Result[1:3,]  #访问1-3行

StudentID names subjects scores

1 2014 小明 英语 87

2 2015 小红 英语 98

3 2016 小兰 英语 93

> Result[1:3]  #访问1-3列

StudentID names subjects

1 2014 小明 英语

2 2015 小红 英语

3 2016 小兰 英语> Result[c(1,3),]  #只访问1,3行,注意写法 c( )

StudentID names subjects scores

1 2014 小明 英语 87

3 2016 小兰 英语 93

> Result[c(1,4)]  #只访问1,4列,注意写法 c( )

StudentID scores

1 2014 87

2 2015 98

3 2016 93

> Result[c("names","scores")]  #只访问names和scores列,注意写法 c( )

names scores

1 小明 87

2 小红 98

3 小兰 93

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

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

> attach(Result)

The following objects are masked _by_ .GlobalEnv:

names, scores, StudentID, subjects

The following objects are masked from Result (pos = 3):

names, scores, StudentID, subjects

> name

> score

> detach(Result)

> name

[1] "小明" "小红" "小兰"

> score

[1] 87 98 93

> mean(score)

[1] 92.66667

方法二:用with函数

> with(Result,{score

> score

[1] 87 98 93

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

> Result$age

> Result

StudentID names subjects scores age

1 2014 小明 英语 87 12

2 2015 小红 英语 98 14

3 2016 小兰 英语 93 13

> Result2

> Result2

StudentID subjects scores age

1 2014 英语 87 12

2 2015 英语 98 14

3 2016 英语 93 13

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

> Result[which(Result$scores==98),]

StudentID names subjects scores age

2 2015 小红 英语 98 14

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

> myarray

C1 C2 C3 C4 C5

R1 1 5 9 13 17

R2 2 6 10 14 18

R3 3 7 11 15 19

R4 4 8 12 16 20

> myarrayframe

> myarrayframe

C1 C2 C3 C4 C5

R1 1 5 9 13 17

R2 2 6 10 14 18

R3 3 7 11 15 19

R4 4 8 12 16 20

> is.data.frame(myarray)

[1] FALSE

> is.data.frame(myarrayframe)

[1] TRUE

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

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

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

> mydataframe

C1 C2 C3 C4 C5

R1 1 5 9 13 17

R2 2 6 10 14 18

R3 3 7 11 15 19

R4 4 8 12 16 20

> mydataframe["C4"]

C4

R1 13

R2 14

R3 15

R4 16

> mean(mydataframe["C4"])

[1] NA

Warning message:

In mean.default(mydataframe["C4"]) : 参数不是数值也不是逻辑值:回覆NA

> is.data.frame(mydataframe["C4"])

[1] TRUE

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

> myarray2

> is.matrix(myarray2)

[1] TRUE

> myarray2

C1 C2 C3 C4 C5

R1 1 5 9 13 17

R2 2 6 10 14 18

R3 3 7 11 15 19

R4 4 8 12 16 20

> x

> x

R1 R2 R3 R4

9 10 11 12

> is.vector(x) #查看x是否为向量类型

[1] TRUE

> mean(x)

[1] 10.5

> sum(x)

[1] 42

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

> c

> c

[1] 9 10 11 12

> is.vector(c)

[1] TRUE

> mean(c)

[1] 10.5

> sum(c)

[1] 42

同时,也可以利用dataframe$(新的列名)

> mydataframe$sum

> mydataframe$mean

> mydataframe

C1 C2 C3 C4 C5 sum mean

R1 1 5 9 13 17 14 7

R2 2 6 10 14 18 16 8

R3 3 7 11 15 19 18 9

R4 4 8 12 16 20 20 10

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

> x1

> x2

> mydataframe2

> mydataframe2

C1 C2 C3 C4 C5 sum mean sum2 mean2

R1 1 5 9 13 17 14 7 10 5

R2 2 6 10 14 18 16 8 12 6

R3 3 7 11 15 19 18 9 14 7

R4 4 8 12 16 20 20 10 16 8



推荐阅读
  • excel怎么自动求乘积(平均值公式)
    2、如果使用单元格引用或数组作为Average函数的参数,那么参数必须为数值,其他类型的值将被忽略。功能:计算满足给定条件的所有单元格的算术平均值,即单条件计算平均值。注意实现:1 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
author-avatar
翁向军_943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有