R语言dataframe的常用操作总结
前言:近段时间学习R语言用到最多的数据格式就是data.frame,现对data.frame常用操作进行总结,其中函数大部分来自dplyr包,该包由Hadley Wickham所作,主要用于数据的清洗和整理。
一、创建
data.frame创建较为容易,调用data.frame函数即可。本文创建一个关于学生成绩的数据框,接下来大部分操作都对该数据框进行,其中学生成绩随机产生
> library(dplyr) #导入dplyr包
> options(digits = 0) #保留整数
> set.seed(1) #设置种子函数
> df <- data.frame(ID = 1:12, #ID
+ Class = rep(c(1,2,3),4), #班级
+ Chinese = runif(12,min = 0,max = 100), #语文
+ Math = runif(12,min = 0,max = 100), #数学
+ English = runif(12,min = 0,max = 100)) #英语
> for (i in 1:ncol(df)) {
+ df[,i] <- as.integer(df[,i]) #将每列类型变为integer型
+ }
df结果如下
> df
ID Class Chinese Math English
1 1 1 26 68 26
2 2 2 37 38 38
3 3 3 57 76 1
4 4 1 90 49 38
5 5 2 20 71 86
6 6 3 89 99 34
7 7 1 94 38 48
8 8 2 66 77 59
9 9 3 62 93 49
10 10 1 6 21 18
11 11 2 20 65 82
12 12 3 17 12 66
二、 查询
1、查询某一行或某一列
可通过 data.frame[行号,] 或者 data.frame[,列号] 操作完成
其中 data.frame[行号,] 得到的类型是数据框
而 data.frame[,列号] 得到的类型是该列的类型
> df[2,]
ID Class Chinese Math English
2 2 2 37 38 38
> df[,4]
[1] 68 38 76 49 71 99 38 77 93 21 65 12
查询某一列还可以通过 data.frame$列名 操作完成
> df$Chinese
[1] 26 37 57 90 20 89 94 66 62 6 20 17
data.frame[列号] 得到一个仅包含该列内容的数据框
> df[3]
Chinese
1 26
2 37
3 57
4 90
5 20
6 89
7 94
8 66
9 62
10 6
11 20
12 17
若要查找符合条件的行,可采用 which() 函数,得到的类型是数据框
> df[which(df$ID == 4),]
ID Class Chinese Math English
4 4 1 90 49 38
2、查询某一个值
可通过 data.frame[行号,列号] 或 data.frame[行号,‘列名’] 操作完成
> df[3,4]
[1] 76
> df[3,'Math']
[1] 76
若查找符合条件的值,可采用 which() 函数
> df[which(df$Chinese == 57),'Math'] #查询语文成绩为57的同学的数学成绩
[1] 76
> df[which(df$Class == 2),'English'] #查询班级号为2的同学的英语成绩
[1] 38 86 59 82
三、修改
1、修改某一行或列
> df[1,] <- c(1,2,65,59,73) #修改第一行
#修改英语成绩
> df[,'English'] <- c(23,45,67,87,34,46,87,95,43,76,23,94)
修改后结果为(1号同学英语成绩先由26修改为73,再修改为23)
> df
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 57 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 6 21 76
11 11 2 20 65 23
12 12 3 17 12 94
2、修改某一个值
直接将需要修改后的值赋给上述查询某一个值的操作即可
> df[3,'Chinese'] <- 65 #将3号同学的语文成绩修改为65
#将语文成绩低于20的同学的语文成绩修改为20
> df[which(df$Chinese < 20),'Chinese'] <- 20
> df
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
3、修改行列名
可用rownames()及colnames()得到数据框的行列名,rownames(data.frame)[行号] 或 colnames(data.frame)[列号] 可得到指定位置的行名或者列名,若修改直接赋值给该变量即可
> colnames(df) #查询列名
[1] "ID" "Class" "Chinese" "Math" "English"
> colnames(df)[4] #查询第4列列名
[1] "Math"
> colnames(df)[4] <- "math" #修改第4列列名为math
#修改列名
> colnames(df) <- c("ID","Class","Chinese","Math","English")
四、删除
删除行或列,仅需要选出该数据框的部分行或列,然后将其赋给该变量即可,其中在列号或行号前添加-表示不选该行或该列,在这里,为了方便接下来的操作,我们将选出后的数据框赋给其他变量,要实现删除操作应当将选出后的数据框赋给自己
#选出df第1、3、5列 ( df <- df[,c(1,3,5)] )
> df.tmp <- df[,c(1,3,5)]
> df.tmp
ID Chinese English
1 1 65 23
2 2 37 45
3 3 65 67
4 4 90 87
5 5 20 34
6 6 89 46
7 7 94 87
8 8 66 95
9 9 62 43
10 10 20 76
11 11 20 23
12 12 20 94
#删除df第3行 ( df <- df[-3,] )
> df.tmp <- df[-3,]
> df.tmp
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
五、添加
1、添加行
data.frame[新行号,] <- 行值
> df[13,] <- c(13,2,62,19,38) #新增13行数据
> df
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
13 13 2 62 19 38
若想对行进行复制,可以采用重复行号的方法
> df <- df[c(1,1:12),] #复制第1行1次
> df
ID Class Chinese Math English
1 1 2 65 59 23
1.1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
可使用rep()函数方便进行多行的复制
> df <- df[rep(1:12,each = 2),] #对每行数据复制1次
> df
ID Class Chinese Math English
1 1 2 65 59 23
1.1 1 2 65 59 23
2 2 2 37 38 45
2.1 2 2 37 38 45
3 3 3 65 76 67
3.1 3 3 65 76 67
4 4 1 90 49 87
4.1 4 1 90 49 87
5 5 2 20 71 34
5.1 5 2 20 71 34
6 6 3 89 99 46
6.1 6 3 89 99 46
7 7 1 94 38 87
7.1 7 1 94 38 87
8 8 2 66 77 95
8.1 8 2 66 77 95
9 9 3 62 93 43
9.1 9 3 62 93 43
10 10 1 20 21 76
10.1 10 1 20 21 76
11 11 2 20 65 23
11.1 11 2 20 65 23
12 12 3 20 12 94
12.1 12 3 20 12 94
还可采用rbind()函数,后续会有示例
2、添加列
data.frame$新列名 <- 列值
> df$Physics <- c(23,34,67,23,56,67,78,23,54,56,67,34)
> df
ID Class Chinese Math English Physics
1 1 2 65 59 23 23
2 2 2 37 38 45 34
3 3 3 65 76 67 67
4 4 1 90 49 87 23
5 5 2 20 71 34 56
6 6 3 89 99 46 67
7 7 1 94 38 87 78
8 8 2 66 77 95 23
9 9 3 62 93 43 54
10 10 1 20 21 76 56
11 11 2 20 65 23 67
12 12 3 20 12 94 34
data.frame[,新列号] <- 列值
> df[,7] <- c(1:12)
> df
ID Class Chinese Math English Physics V7
1 1 2 65 59 23 23 1
2 2 2 37 38 45 34 2
3 3 3 65 76 67 67 3
4 4 1 90 49 87 23 4
5 5 2 20 71 34 56 5
6 6 3 89 99 46 67 6
7 7 1 94 38 87 78 7
8 8 2 66 77 95 23 8
9 9 3 62 93 43 54 9
10 10 1 20 21 76 56 10
11 11 2 20 65 23 67 11
12 12 3 20 12 94 34 12
还可用dplyr包中的mutate()函数
> mutate(df,Chemistry = Chinese + Math + English + Physics)
ID Class Chinese Math English Physics V7 Chemistry
1 1 2 65 59 23 23 1 170
2 2 2 37 38 45 34 2 154
3 3 3 65 76 67 67 3 275
4 4 1 90 49 87 23 4 249
5 5 2 20 71 34 56 5 181
6 6 3 89 99 46 67 6 301
7 7 1 94 38 87 78 7 297
8 8 2 66 77 95 23 8 261
9 9 3 62 93 43 54 9 252
10 10 1 20 21 76 56 10 173
11 11 2 20 65 23 67 11 175
12 12 3 20 12 94 34 12 160
还可采用cbind()函数,后续会有示例
六、dplyr包常用函数
> df #原数据
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
1、arrange() 排序
arrange(.data, ...)
arrange(.data, ..., .by_group = FALSE)
> arrange(df,Chinese) #按语文成绩由小到大排序
ID Class Chinese Math English
1 5 2 20 71 34
2 10 1 20 21 76
3 11 2 20 65 23
4 12 3 20 12 94
5 2 2 37 38 45
6 9 3 62 93 43
7 1 2 65 59 23
8 3 3 65 76 67
9 8 2 66 77 95
10 6 3 89 99 46
11 4 1 90 49 87
12 7 1 94 38 87
函数中第一个是待排序的数据框,之后依次是变量,且变量优先级逐渐降低,如语文、数学成绩进行排序
> arrange(df,Chinese,Math) #依次按语文、数学成绩由小到大排序
ID Class Chinese Math English
1 12 3 20 12 94
2 10 1 20 21 76
3 11 2 20 65 23
4 5 2 20 71 34
5 2 2 37 38 45
6 9 3 62 93 43
7 1 2 65 59 23
8 3 3 65 76 67
9 8 2 66 77 95
10 6 3 89 99 46
11 4 1 90 49 87
12 7 1 94 38 87
若想由大到小排序,使用desc()函数
> arrange(df,desc(Chinese)) #按语文成绩由大到小排序
ID Class Chinese Math English
1 7 1 94 38 87
2 4 1 90 49 87
3 6 3 89 99 46
4 8 2 66 77 95
5 1 2 65 59 23
6 3 3 65 76 67
7 9 3 62 93 43
8 2 2 37 38 45
9 5 2 20 71 34
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
2、distinct()函数 去重
distinct(.data, ..., .keep_all = FALSE)
> df1 <- df[rep(1:nrow(df),each = 2),] #将df每行复制1次
> df1
ID Class Chinese Math English
1 1 2 65 59 23
1.1 1 2 65 59 23
2 2 2 37 38 45
2.1 2 2 37 38 45
3 3 3 65 76 67
3.1 3 3 65 76 67
4 4 1 90 49 87
4.1 4 1 90 49 87
5 5 2 20 71 34
5.1 5 2 20 71 34
6 6 3 89 99 46
6.1 6 3 89 99 46
7 7 1 94 38 87
7.1 7 1 94 38 87
8 8 2 66 77 95
8.1 8 2 66 77 95
9 9 3 62 93 43
9.1 9 3 62 93 43
10 10 1 20 21 76
10.1 10 1 20 21 76
11 11 2 20 65 23
11.1 11 2 20 65 23
12 12 3 20 12 94
12.1 12 3 20 12 94
> df1 <- distinct(df1) #去除重复的行
> df1
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
3、group_by()函数 分组 summarise()函数 概括
group_by(.data, ..., add = FALSE, .drop = FALSE)
ungroup(x, ...)
summarise(.data, ...)
group_by()与summarise()函数常连用,用于对不同的分组进行操作,在这里再介绍一个管道函数“%>%”,其作用是把左件的值发送给右件的表达式,并作为右件表达式函数的第一个参数
> df %>%
+ group_by(Class) %>%
+ summarise(max = max(Chinese)) #求出按Class分组每组中语文成绩最高分
# A tibble: 3 x 2
Class max
<dbl> <dbl>
1 1 94
2 2 66
3 3 89
4、filter()函数 筛选
filter(.data, ..., .preserve = FALSE)
选出符合条件的行(返回数据框格式)
> df %>%
+ group_by(Class) %>%
+ filter(Chinese == max(Chinese)) #选出每个班语文成绩最高的学生的信息
# A tibble: 3 x 5
# Groups: Class [3]
ID Class Chinese Math English
<dbl> <dbl> <dbl> <dbl> <dbl>
1 6 3 89 99 46
2 7 1 94 38 87
3 8 2 66 77 95
5、select()函数 选择
select(.data, ...)
> select(df,ID,Chinese,Math,English) #选出df中ID、语文、数学、英语数据
ID Chinese Math English
1 1 65 59 23
2 2 37 38 45
3 3 65 76 67
4 4 90 49 87
5 5 20 71 34
6 6 89 99 46
7 7 94 38 87
8 8 66 77 95
9 9 62 93 43
10 10 20 21 76
11 11 20 65 23
12 12 20 12 94
6、rbind()函数与cbind()函数 合并
rbind()函数根据行进行合并,cbind()根据列进行合并
#新建数据框df1
> df1 <- data.frame(ID = 13,Class = 2,
Chinese = 65,Math = 26,English = 84)
> df1
ID Class Chinese Math English
1 13 2 65 26 84
> rbind(df,df1) #合并df与df1
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
13 13 2 65 26 84
> df2 #新建数据框df2
Biological
1 65
2 15
3 35
4 59
5 64
6 34
7 29
8 46
9 32
10 95
11 46
12 23
> cbind(df,df2) #合并df与df2
ID Class Chinese Math English Biological
1 1 2 65 59 23 65
2 2 2 37 38 45 15
3 3 3 65 76 67 35
4 4 1 90 49 87 59
5 5 2 20 71 34 64
6 6 3 89 99 46 34
7 7 1 94 38 87 29
8 8 2 66 77 95 46
9 9 3 62 93 43 32
10 10 1 20 21 76 95
11 11 2 20 65 23 46
12 12 3 20 12 94 23
7、join函数 连接
inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),...)
left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),...)
full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
semi_join(x, y, by = NULL, copy = FALSE, ...)
nest_join(x, y, by = NULL, copy = FALSE, keep = FALSE, name = NULL,...)
anti_join(x, y, by = NULL, copy = FALSE, ...)
join函数类型比较多,这里仅以left_join()函数举例
#新建数据框Class
> Class <- data.frame(Class = c(1,2,3),class = c('一班','二班','三班'))
> Class
Class class
1 1 一班
2 2 二班
3 3 三班
> left_join(df,Class,by = 'Class') #基于Class变量左连接df与Class数据框
ID Class Chinese Math English class
1 1 2 65 59 23 二班
2 2 2 37 38 45 二班
3 3 3 65 76 67 三班
4 4 1 90 49 87 一班
5 5 2 20 71 34 二班
6 6 3 89 99 46 三班
7 7 1 94 38 87 一班
8 8 2 66 77 95 二班
9 9 3 62 93 43 三班
10 10 1 20 21 76 一班
11 11 2 20 65 23 二班
12 12 3 20 12 94 三班
left_join()函数仅保留df对应的Class值的数据
以上是关于data.frame数据框的一点学习总结,如有错误,敬请谅解。
R语言dataframe的常用操作总结的更多相关文章
- R语言 入门知识--常用操作和例子
1 R的下载.安转 (转)R有很多的版本,支持目前主流的操作系统MAC.Linux和WINDOWS系列.因为我个人是在WINDOWS下用R的,所以在这里将只介绍WINDOWS下R的下载&安 ...
- R语言文件相关的操作
1. 文件系统介绍 R语言对文件系统的操作,包括文件操作和目录操作,函数API都定义在base包中. 2. 目录操作 2.1 查看目录 查看当前目录下的子目录. # 启动R程序 ~ R # 当前的目录 ...
- R语言之数据处理常用包
dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口:tidyr包的作者是Hadley ...
- R语言进行文件夹操作示例(转)
rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A& ...
- 【sparkSQL】DataFrame的常用操作
scala> import org.apache.spark.sql.SparkSession import org.apache.spark.sql.SparkSession scala> ...
- R 语言DataFrame 排序
Sort:dd <- data.frame(b = factor(c("Hi","Med","Hi","Low") ...
- pandas DataFrame 数据处理常用操作
Xgboost调参: https://wuhuhu800.github.io/2018/02/28/XGboost_param_share/ https://blog.csdn.net/hx2017/ ...
- R语言描述性统计常用函数
- R语言笔记
R语言笔记 学习R语言对我来说有好几个地方需要注意的,我觉得这样的经验也适用于学习其他的新的语言. 语言的目标 我理解语言的目标就是这个语言是用来做什么的,为什么样的任务服务的,也就是设计这个语言的动 ...
随机推荐
- TP5.1 调用common里面自定义的常量
公共文件:\application\common.php define('cms_password', cms); 控制器引用: 调用: $aa = cms_password; dump(cms_pa ...
- android studio学习----通过libs来导入jar包
百度经验有一种方法: 1 点击启动AndroidStudio,启动后的界面如图所示. 2 复制你需要添加的jar,并将其黏贴到app— —src— —main— —libs文件夹下,可运行的Andro ...
- SAP云平台和第三方CRM解决方案(火锅)互联
光看封面配图,这篇文章很容易被误认为在讲成都的美食之一:火锅. SAP成都研究院坐落在被联合国教科文组织授予过"美食之都"称号的成都,所在的天府软件园,半径1公里左右星罗棋布着很多 ...
- 给easyui datebox扩展一个清空按钮,无侵入
/** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; (function ($) { var buttons = $.ext ...
- mysql 常用 sql 语句 - 快速查询
Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互 1.1.1 mysql 连接 mysql.exe -hPup ...
- Linux使用pt-archiver工具自动备份MySQL
操作系统: CentOS 6.9 脚本语言: shell https://github.com/iscongyang/Practical/blob/master/shell-scripts/pt-ar ...
- mysql 忘记密码,赋予用户权限,两台服务器的数据库之间快速导入
mysql 忘记密码: 1.首先service mysql stop mysqld --skip-grant-tables & 开启数据库 然后就可以mysql -uroot 直接进数据库, ...
- 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?
在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被 ...
- 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)
题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...
- CentOS7 最小安装 vmware 创建虚拟机 nmcli ip systemctl
镜像网站 一些开源软件的国内镜像源 站点版 (一).企业站 1.搜狐:http://mirrors.sohu.com/ 2.网易:http://mirrors.163.com/ 3.阿里云:http: ...