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

上篇我们了解了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

方式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的最基本最简单的数据框操作方法,更进阶更高效的方法将在之后继续整理。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与理论

python 网络编程(udp)

        什么是UDP:UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流...

39270
来自专栏灯塔大数据

大数据奇葩说:中国常见家用Wifi密码

前些日子,一位程序员改了一个Telnet Wifi扫描脚本,经过两三天的扫描,积累了9万余条Wifi密码数据。遂针对扫描到的数据做一次简单的分析,得到了中国家...

43580
来自专栏机器学习养成记

R语言爬虫与文本分析

之前用python做过简单的爬虫与分析,今天尝试一下用R完成相应的功能。首先用R爬取了《了不起的麦瑟尔夫人》豆瓣短评作为语料,然后进行了词云绘制、关键词提取的基...

507140
来自专栏奇点大数据

你的“跳一跳”榜上有名了吗?聊聊“跳一跳”开挂方法

最近“跳一跳”在朋友圈风靡一时,吃饭的时候,人家跟你聊跳了多少步,你要没上200都不好意思跟人家打招呼。作为AI研发的机构,我们更关心怎么样才能自动让AI走的更...

37760
来自专栏机器学习算法与理论

调用Dlib库进行人脸关键点标记

       昨天调试了人脸识别(classifier_webcam)这个程序,效果不错,响应速度也挺快。按照http://blog.csdn.net/u011...

53490
来自专栏林欣哲

凯撒加密之一个神奇的Python的API

凯撒加密 在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。 本质上恺撒加密就是一种替换加密的方式。 明文中的所有字母都在字母表上向后(或向前)按照一个固...

46850
来自专栏iOS技术杂谈

Python Garbage Collection 与 Objective-C ARCPython GC 与 Objective-C ARC

转载请注明出处 https://cloud.tencent.com/developer/user/1605429 Python GC 与 Objective-C...

34070
来自专栏专知

【干货】机器学习经典 PRML 最新 Python 代码实现,附最全 PRML 笔记视频学习资料

【导读】最近GitHub上网友ctgk公布了Python实现的经典机器学习图书《Pattern Recognition and Machine Learning...

2.8K70
来自专栏奇点大数据

深度学习工程师的4个档次

最近不少朋友问我,转行做深度学习的话,能不能找到工作,能找到什么样的工作,能达到什么样的收入水平…… 这种问题其实不仅仅是存在与深度学习行业的入门和转型中的思...

40470
来自专栏抠抠空间

MySQL之pymysql模块

PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。 Django中...

43770

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励