上篇我们了解了Python中pandas内封装的关于数据框的常用操作方法,而作为专为数据科学而生的一门语言,R在数据框的操作上则更为丰富精彩,本篇就R处理数据框的常用方法进行总结:

1.数据框的生成

利用data.frame()函数来创建数据框,其常用参数如下:

...:数据框的构成向量的变量名,顺序即为生成的数据框列的顺序

row.names:对每一行命名的向量

stringAsFactors:是否将数据框中字符型数据类型转换为因子型,默认为FALSE

> a <- 1:10
> b <- 10:1
> c <- c('a','b','c','d','e','f','g','h','i','j')
> df <- data.frame(a,b,c,row.names = c)
> df
a b c
a 1 10 a
b 2 9 b
c 3 8 c
d 4 7 d
e 5 6 e
f 6 5 f
g 7 4 g
h 8 3 h
i 9 2 i
j 10 1 j

改变stringAsFactors的默认值,第三列数据的数据类型发生了改变:

> a <- 1:10
> b <- 10:1
> c <- c('a','b','c','d','e','f','g','h','i','j')
> df <- data.frame(a,b,c,row.names = c, stringsAsFactors = F)
> str(df)
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: int 10 9 8 7 6 5 4 3 2 1
$ c: chr "a" "b" "c" "d" ...
> df <- data.frame(a,b,c,row.names = c, stringsAsFactors = T)
> str(df)
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: int 10 9 8 7 6 5 4 3 2 1
$ c: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10

2.数据框的索引

方式1:

按列的名称进行索引

> df$a
[1] 1 2 3 4 5 6 7 8 9 10

> df$a[2:10]
   [1] 2 3 4 5 6 7 8 9 10

方式2:

按对应轴的标号进行索引

> df[2]
b
a 10
b 9
c 8
d 7
e 6
f 5
g 4
h 3
i 2
j 1
> df[2:4,]
a b c
b 2 9 b
c 3 8 c
d 4 7 d

方式3:

通过attach()将数据框临时挂载,直接通过列名索引数据

> df <- data.frame('AA'=a,'B'=b,'C'=c,row.names = c, stringsAsFactors = T)
> attach(df)
> AA
[1] 1 2 3 4 5 6 7 8 9 10
> B
[1] 10 9 8 7 6 5 4 3 2 1
> detach(df)

方式4:

通过with()将数据框临时挂载,以直接通过列名索引数据

> df <- data.frame('AA'=a,'B'=b,'C'=c,row.names = c, stringsAsFactors = F)
> with(df,{
C
})
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

3.数据框的拼接

rbind()与cbind():

> df1 <- data.frame(a,b,c,row.names = c, stringsAsFactors = F)
> df2 <- data.frame('AA'=b,'B'=a,'C'=c,row.names = c, stringsAsFactors = F)
> cbind(df1,df2)#cbind()按列横向拼接数据框
a b c AA B C
a 1 10 a 10 1 a
b 2 9 b 9 2 b
c 3 8 c 8 3 c
d 4 7 d 7 4 d
e 5 6 e 6 5 e
f 6 5 f 5 6 f
g 7 4 g 4 7 g
h 8 3 h 3 8 h
i 9 2 i 2 9 i
j 10 1 j 1 10 j
> rbind(df1,df1)#按列纵向拼接数据框(列名一定要对应)
a b c
1 1 10 a
2 2 9 b
3 3 8 c
4 4 7 d
5 5 6 e
6 6 5 f
7 7 4 g
8 8 3 h
9 9 2 i
10 10 1 j
11 1 10 a
12 2 9 b
13 3 8 c
14 4 7 d
15 5 6 e
16 6 5 f
17 7 4 g
18 8 3 h
19 9 2 i
20 10 1 j

4.数据框的合并操作

在R中,通过内联键合并数据框的函数为merge(),其主要参数如下:

by:对两个数据框建立内联的共有列(元素交集部分不能为空集),以此列为依据,返回内联列取交集后剩下的样本行

sort:是否对合并后的数据框以内联列为排序依据进行排序,默认为TRUE

suffixes:对合并后数据框同名的列采取的重命名的后缀内容

> a <- 1:10
> b <- 10:1
> c <- c('b','a','c','d','e','f','g','h','i','j')
> d <- c('b','a','c','d','e','f','g','h','k','j')
> df1 <- data.frame(a,'ID'=c, stringsAsFactors = F)
> df2 <- data.frame(b,'ID'=d,stringsAsFactors = F)
> df1
a ID
1 1 b
2 2 a
3 3 c
4 4 d
5 5 e
6 6 f
7 7 g
8 8 h
9 9 i
10 10 j
> df2
b ID
1 10 b
2 9 a
3 8 c
4 7 d
5 6 e
6 5 f
7 4 g
8 3 h
9 2 k
10 1 j

对上述两个数据框以’ID‘列为内联列进行合并,得到结果如下,与Python不同的是,R中的数据框合并的原则是不返回含有缺失值的行

> merge(df1,df2,by='ID')
ID a b
1 a 2 9
2 b 1 10
3 c 3 8
4 d 4 7
5 e 5 6
6 f 6 5
7 g 7 4
8 h 8 3
9 j 10 1

设置sort为FALSE

> merge(df1,df2,by='ID',sort=FALSE)
ID a b
1 b 1 10
2 a 2 9
3 c 3 8
4 d 4 7
5 e 5 6
6 f 6 5
7 g 7 4
8 h 8 3
9 j 10 1

5.数据框的抽样筛选

利用样本抽取函数sample()通过对行或列进行范围之指定进行数据框的抽样筛选:

> df1[sample(1:nrow(df1),3,replace=FALSE),]
a ID
6 6 f
10 10 j
2 2 a

6.数据框的条件筛选

方式1:

普通的条件筛选:

> df1[df1$a >= 6,]
a ID
6 6 f
7 7 g
8 8 h
9 9 i
10 10 j
> df1[df1$a >= 6 & df1$a <= 9,]
a ID
6 6 f
7 7 g
8 8 h
9 9 i

方式2:

利用subset()函数来进行条件筛选,其第一个输入值为待筛选的数据框,第二个位置写入行筛选的条件(或多个条件的逻辑符连接的组合筛选),第三个select参数控制选中的列:

> subset(df1, a >= 6& a <=8)
a ID
6 6 f
7 7 g
8 8 h
> subset(df1, a >= 6& a <=8, select='ID')
ID
6 f
7 g
8 h

7.数据框的去重

这里我们使用重复值检测函数duplicated()以及数据框元素删减方法联合起来完成去重的工作,先依次介绍这两个方法:

duplicated(),用于检测输入的列中有无符合元素重复的行(若输入多列则检测是否存在行的多列组合方式中有无满足重复的行),并返回对应每一列的逻辑型变量。

> a <- 1:10
> c <- c('b','a','c','d','b','a','d','c','i','j')
> d <- c('b','a','c','d','b','a','g','c','k','j')
> df <- data.frame(c,c,d)
> df
c c.1 d
1 b b b
2 a a a
3 c c c
4 d d d
5 b b b
6 a a a
7 d d g
8 c c c
9 i i k
10 j j j
> duplicated(df)
[1] FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE FALSE FALSE

可以看出,bbb,aaa,ccc这三种组合方式在数据框中重复多次,因此对这三种方式第二次及以后出现的情况返回TRUE,其余的行返回FALSE

数据框删除方法:df[!需要删除的行,!需要删除的列]

上面的duplicated(df)已经提取出df的所有重复行的逻辑型标号,因此只需要在删除方法里设置删除的标号为duplicated(df)的返回值即可:

> df[!duplicated(df),]
c c.1 d
1 b b b
2 a a a
3 c c c
4 d d d
7 d d g
9 i i k
10 j j j

可以看到,所有重复行均已清除。

8.数据框的排序

数据框的order()函数:

> a <- c(2:8,1,10,9)
> c <- c('b','a','c','d','b','a','d','c','i','j')
> d <- c('b','a','c','d','b','a','g','c','k','j')
> df <- data.frame(a,c,d)
> df
a c d
1 2 b b
2 3 a a
3 4 c c
4 5 d d
5 6 b b
6 7 a a
7 8 d g
8 1 c c
9 10 i k
10 9 j j
> newdata <- df[order(a)]
Error in `[.data.frame`(df, order(a)) : undefined columns selected
> newdata
a c d
1 1 b b
2 2 a a
3 3 c c
4 4 d d
5 5 b b
6 6 a a
7 7 d g
8 8 c c
9 9 i k
10 10 j j

9.缺失值的处理

有时候我们会遇到含有缺省值NA的数据框,这时如果直接进行数据框内的运算,因为NA的干扰,最后的结果往往也是NA,好在R对大部分整体数值运算都有参数na.rm来控制,TRUE时会自动跳过含有NA的计算部分:

> a <- c(1,2,4,3,NA)
> c <- c('b','a','c','d','b')
> d <- c('b','a','c','d','b')
> df <- data.frame(a,c,d)
> df
a c d
1 1 b b
2 2 a a
3 4 c c
4 3 d d
5 NA b b
> mean(df[,1])
[1] NA
> mean(df[,1],na.rm = T)
[1] 2.5

使用na.omit()剔除残缺的行:

> df
a c d
1 1 b b
2 2 a a
3 4 c c
4 3 d d
5 NA b b
> complete.cases(df)#识别数据集中位置有无缺省值
[1] TRUE TRUE TRUE TRUE FALSE
> which(complete.cases(df)==F)#显示所有含有缺省值的行标号
[1] 5
> sum(complete.cases((df)))#完整观测值的个数
[1] 4
> na.omit(df)#删去含有缺失值的行
a c d
1 1 b b
2 2 a a
3 4 c c
4 3 d d

以上就是R的最基本最简单的数据框操作方法,更进阶更高效的方法将在之后继续整理。

(数据科学学习手札07)R在数据框操作上方法的总结(初级篇)的更多相关文章

  1. (数据科学学习手札70)面向数据科学的Python多进程简介及应用

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 进程是计算机系统中资源分配的最小单位,也是操作系 ...

  2. (数据科学学习手札06)Python在数据框操作上的总结(初级篇)

    数据框(Dataframe)作为一种十分标准的数据结构,是数据分析中最常用的数据结构,在Python和R中各有对数据框的不同定义和操作. Python 本文涉及Python数据框,为了更好的视觉效果, ...

  3. (数据科学学习手札40)tensorflow实现LSTM时间序列预测

    一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...

  4. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

  5. (数据科学学习手札47)基于Python的网络数据采集实战(2)

    一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...

  6. (数据科学学习手札44)在Keras中训练多层感知机

    一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...

  7. (数据科学学习手札42)folium进阶内容介绍

    一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...

  8. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

  9. (数据科学学习手札61)xpath进阶用法

    一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...

随机推荐

  1. rac数据库默认sql tuning advisor,导致大量library cache lock

    rac数据库默认sql tuning advisor,导致大量library cache lock 问题现象:客户反映周六周日固定十点钟,一个程序会特别慢(大概10分钟),平时1到2秒.查看当时的日志 ...

  2. python接口测试-项目实践(二)获取接口响应,取值(re、json)

    一 分别请求3个接口,获取响应. 第三方接口返回有两种:1 纯字符串  2 带bom头的json字串 import requests api1 = 'url1' response1 = request ...

  3. 如何用python语言撸出图表系统

    公司指标图表化显示,解决目前跟踪技术指标数据的各种不方便:于是话不多说,撸起袖子就是干: 1.挖掘需求和罗列功能点: a.图表显示技术指标数据. b.根据服务名和系统名查询对应的图表. c.根据日期区 ...

  4. Full scan vs index 执行计划的实验

    根据Oracle-L邮件列表里主题「 Full scan vs index 」的讨论而来. 1.测试环境创建 SYS@HEMESRHTDB2(1.206)> select * from v$ve ...

  5. ORACLE常用函数汇总(持续更新中....)

    在使用ORACLE过程中,把一些常用的函数的相关用法,注意事项进行简单的汇总,便于自己查询参考. DBMS_RANDOM包 dbms_random是一个可以生成随机数值或者字符串的程序包.这个包有in ...

  6. linux shell——zsh的安装与使用

    Shell是在程序员与服务器间建立一个桥梁,它对外提供一系列命令,让我们得以控制服务器.常用的Bash就是Shell的一种,也是Linux下默认Shell程序.这里介绍一种更强大的.更人性化的Shel ...

  7. Window下搭建foundation apps环境

    Window下搭建foundation apps环境 框架:AngularJS.Foundation, 构建工具:Gulp, 开发环境:node.js. 操作系统:windows (一)环境准备 1 ...

  8. div可编辑框,去除粘贴文字样式😄

    上个月做了个聊天的需求(网页版的).说到聊天都想到输入框,说到输入框都会想到input,但是input标签是不支持插入图片的(包括areatext标签).查阅了一些资料就看到div标签有一个属性con ...

  9. 使用TextView/EditText应该注意的地方,监听EditText,addTextChangedListener

    http://blog.csdn.net/huichengongzi/article/details/7818676 监听 EditText 控件: addTextChangedListener(ne ...

  10. mysql复制表数据,多表数据复制到一张表

    对于mysql 复制表数据可以使用 insert into select 方式 示例: $sql="insert into icarzoo.provider(providerId,provi ...