R语言data.frame的常用操作总结

您所在的位置:网站首页 dataframe选择多行 R语言data.frame的常用操作总结

R语言data.frame的常用操作总结

2023-08-11 07:49| 来源: 网络整理| 查看: 265

前言:近段时间学习R语言用到最多的数据格式就是data.frame,现对data.frame常用操作进行总结,其中函数大部分来自dplyr包,该包由Hadley Wickham所作,主要用于数据的清洗和整理。

一、创建

data.frame创建较为容易,调用data.frame函数即可。本文创建一个关于学生成绩的数据框,接下来大部分操作都对该数据框进行,其中学生成绩随机产生

1 > library(dplyr) #导入dplyr包 2 > options(digits = 0) #保留整数 3 > set.seed(1) #设置种子函数 4 > df for (i in 1:ncol(df)) { 10 + df[,i] df 2 ID Class Chinese Math English 3 1 1 1 26 68 26 4 2 2 2 37 38 38 5 3 3 3 57 76 1 6 4 4 1 90 49 38 7 5 5 2 20 71 86 8 6 6 3 89 99 34 9 7 7 1 94 38 48 10 8 8 2 66 77 59 11 9 9 3 62 93 49 12 10 10 1 6 21 18 13 11 11 2 20 65 82 14 12 12 3 17 12 66

二、 查询

1、查询某一行或某一列

可通过 data.frame[行号,] 或者 data.frame[,列号] 操作完成

其中 data.frame[行号,] 得到的类型是数据框

而 data.frame[,列号] 得到的类型是该列的类型

> df[2,] ID Class Chinese Math English2 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[列号] 得到一个仅包含该列内容的数据框

1 > df[3] 2 Chinese 3 1 26 4 2 37 5 3 57 6 4 90 7 5 20 8 6 89 9 7 94 10 8 66 11 9 62 12 10 6 13 11 20 14 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,] df[,'English'] df 2 ID Class Chinese Math English 3 1 1 2 65 59 23 4 2 2 2 37 38 45 5 3 3 3 57 76 67 6 4 4 1 90 49 87 7 5 5 2 20 71 34 8 6 6 3 89 99 46 9 7 7 1 94 38 87 10 8 8 2 66 77 95 11 9 9 3 62 93 43 12 10 10 1 6 21 76 13 11 11 2 20 65 23 14 12 12 3 17 12 94

2、修改某一个值

直接将需要修改后的值赋给上述查询某一个值的操作即可

1 > df[3,'Chinese'] df[which(df$Chinese < 20),'Chinese'] df 5 ID Class Chinese Math English 6 1 1 2 65 59 23 7 2 2 2 37 38 45 8 3 3 3 65 76 67 9 4 4 1 90 49 87 10 5 5 2 20 71 34 11 6 6 3 89 99 46 12 7 7 1 94 38 87 13 8 8 2 66 77 95 14 9 9 3 62 93 43 15 10 10 1 20 21 76 16 11 11 2 20 65 23 17 12 12 3 20 12 94

3、修改行列名

可用rownames()及colnames()得到数据框的行列名,rownames(data.frame)[行号] 或 colnames(data.frame)[列号] 可得到指定位置的行名或者列名,若修改直接赋值给该变量即可

1 > colnames(df) #查询列名 2 [1] "ID" "Class" "Chinese" "Math" "English" 3 > colnames(df)[4] #查询第4列列名 4 [1] "Math" 5 > colnames(df)[4] colnames(df) df df 3 ID Class Chinese Math English 4 1 1 2 65 59 23 5 1.1 1 2 65 59 23 6 2 2 2 37 38 45 7 3 3 3 65 76 67 8 4 4 1 90 49 87 9 5 5 2 20 71 34 10 6 6 3 89 99 46 11 7 7 1 94 38 87 12 8 8 2 66 77 95 13 9 9 3 62 93 43 14 10 10 1 20 21 76 15 11 11 2 20 65 23 16 12 12 3 20 12 94

可使用rep()函数方便进行多行的复制

1 > df df 3 ID Class Chinese Math English 4 1 1 2 65 59 23 5 1.1 1 2 65 59 23 6 2 2 2 37 38 45 7 2.1 2 2 37 38 45 8 3 3 3 65 76 67 9 3.1 3 3 65 76 67 10 4 4 1 90 49 87 11 4.1 4 1 90 49 87 12 5 5 2 20 71 34 13 5.1 5 2 20 71 34 14 6 6 3 89 99 46 15 6.1 6 3 89 99 46 16 7 7 1 94 38 87 17 7.1 7 1 94 38 87 18 8 8 2 66 77 95 19 8.1 8 2 66 77 95 20 9 9 3 62 93 43 21 9.1 9 3 62 93 43 22 10 10 1 20 21 76 23 10.1 10 1 20 21 76 24 11 11 2 20 65 23 25 11.1 11 2 20 65 23 26 12 12 3 20 12 94 27 12.1 12 3 20 12 94

还可采用rbind()函数,后续会有示例

2、添加列

data.frame$新列名 df$Physics df 3 ID Class Chinese Math English Physics 4 1 1 2 65 59 23 23 5 2 2 2 37 38 45 34 6 3 3 3 65 76 67 67 7 4 4 1 90 49 87 23 8 5 5 2 20 71 34 56 9 6 6 3 89 99 46 67 10 7 7 1 94 38 87 78 11 8 8 2 66 77 95 23 12 9 9 3 62 93 43 54 13 10 10 1 20 21 76 56 14 11 11 2 20 65 23 67 15 12 12 3 20 12 94 34

data.frame[,新列号] df[,7] df 3 ID Class Chinese Math English Physics V7 4 1 1 2 65 59 23 23 1 5 2 2 2 37 38 45 34 2 6 3 3 3 65 76 67 67 3 7 4 4 1 90 49 87 23 4 8 5 5 2 20 71 34 56 5 9 6 6 3 89 99 46 67 6 10 7 7 1 94 38 87 78 7 11 8 8 2 66 77 95 23 8 12 9 9 3 62 93 43 54 9 13 10 10 1 20 21 76 56 10 14 11 11 2 20 65 23 67 11 15 12 12 3 20 12 94 34 12

还可用dplyr包中的mutate()函数

1 > mutate(df,Chemistry = Chinese + Math + English + Physics) 2 ID Class Chinese Math English Physics V7 Chemistry 3 1 1 2 65 59 23 23 1 170 4 2 2 2 37 38 45 34 2 154 5 3 3 3 65 76 67 67 3 275 6 4 4 1 90 49 87 23 4 249 7 5 5 2 20 71 34 56 5 181 8 6 6 3 89 99 46 67 6 301 9 7 7 1 94 38 87 78 7 297 10 8 8 2 66 77 95 23 8 261 11 9 9 3 62 93 43 54 9 252 12 10 10 1 20 21 76 56 10 173 13 11 11 2 20 65 23 67 11 175 14 12 12 3 20 12 94 34 12 160

还可采用cbind()函数,后续会有示例

六、dplyr包常用函数

1 > df #原数据 2 ID Class Chinese Math English 3 1 1 2 65 59 23 4 2 2 2 37 38 45 5 3 3 3 65 76 67 6 4 4 1 90 49 87 7 5 5 2 20 71 34 8 6 6 3 89 99 46 9 7 7 1 94 38 87 10 8 8 2 66 77 95 11 9 9 3 62 93 43 12 10 10 1 20 21 76 13 11 11 2 20 65 23 14 12 12 3 20 12 94

1、arrange() 排序

arrange(.data, ...)

arrange(.data, ..., .by_group = FALSE)

1 > arrange(df,Chinese) #按语文成绩由小到大排序 2 ID Class Chinese Math English 3 1 5 2 20 71 34 4 2 10 1 20 21 76 5 3 11 2 20 65 23 6 4 12 3 20 12 94 7 5 2 2 37 38 45 8 6 9 3 62 93 43 9 7 1 2 65 59 23 10 8 3 3 65 76 67 11 9 8 2 66 77 95 12 10 6 3 89 99 46 13 11 4 1 90 49 87 14 12 7 1 94 38 87

函数中第一个是待排序的数据框,之后依次是变量,且变量优先级逐渐降低,如语文、数学成绩进行排序

1 > arrange(df,Chinese,Math) #依次按语文、数学成绩由小到大排序 2 ID Class Chinese Math English 3 1 12 3 20 12 94 4 2 10 1 20 21 76 5 3 11 2 20 65 23 6 4 5 2 20 71 34 7 5 2 2 37 38 45 8 6 9 3 62 93 43 9 7 1 2 65 59 23 10 8 3 3 65 76 67 11 9 8 2 66 77 95 12 10 6 3 89 99 46 13 11 4 1 90 49 87 14 12 7 1 94 38 87

若想由大到小排序,使用desc()函数

1 > arrange(df,desc(Chinese)) #按语文成绩由大到小排序 2 ID Class Chinese Math English 3 1 7 1 94 38 87 4 2 4 1 90 49 87 5 3 6 3 89 99 46 6 4 8 2 66 77 95 7 5 1 2 65 59 23 8 6 3 3 65 76 67 9 7 9 3 62 93 43 10 8 2 2 37 38 45 11 9 5 2 20 71 34 12 10 10 1 20 21 76 13 11 11 2 20 65 23 14 12 12 3 20 12 94

2、distinct()函数 去重

distinct(.data, ..., .keep_all = FALSE)

1 > df1 df1 3 ID Class Chinese Math English 4 1 1 2 65 59 23 5 1.1 1 2 65 59 23 6 2 2 2 37 38 45 7 2.1 2 2 37 38 45 8 3 3 3 65 76 67 9 3.1 3 3 65 76 67 10 4 4 1 90 49 87 11 4.1 4 1 90 49 87 12 5 5 2 20 71 34 13 5.1 5 2 20 71 34 14 6 6 3 89 99 46 15 6.1 6 3 89 99 46 16 7 7 1 94 38 87 17 7.1 7 1 94 38 87 18 8 8 2 66 77 95 19 8.1 8 2 66 77 95 20 9 9 3 62 93 43 21 9.1 9 3 62 93 43 22 10 10 1 20 21 76 23 10.1 10 1 20 21 76 24 11 11 2 20 65 23 25 11.1 11 2 20 65 23 26 12 12 3 20 12 94 27 12.1 12 3 20 12 94 28 > df1 df1 30 ID Class Chinese Math English 31 1 1 2 65 59 23 32 2 2 2 37 38 45 33 3 3 3 65 76 67 34 4 4 1 90 49 87 35 5 5 2 20 71 34 36 6 6 3 89 99 46 37 7 7 1 94 38 87 38 8 8 2 66 77 95 39 9 9 3 62 93 43 40 10 10 1 20 21 76 41 11 11 2 20 65 23 42 12 12 3 20 12 94

3、group_by()函数 分组     summarise()函数 概括

group_by(.data, ..., add = FALSE, .drop = FALSE)

ungroup(x, ...)

summarise(.data, ...)

group_by()与summarise()函数常连用,用于对不同的分组进行操作,在这里再介绍一个管道函数“%>%”,其作用是把左件的值发送给右件的表达式,并作为右件表达式函数的第一个参数

1 > df %>% 2 + group_by(Class) %>% 3 + summarise(max = max(Chinese)) #求出按Class分组每组中语文成绩最高分 4 # A tibble: 3 x 2 5 Class max 6 7 1 1 94 8 2 2 66 9 3 3 89

4、filter()函数 筛选

filter(.data, ..., .preserve = FALSE)

选出符合条件的行(返回数据框格式)

1 > df %>% 2 + group_by(Class) %>% 3 + filter(Chinese == max(Chinese)) #选出每个班语文成绩最高的学生的信息 4 # A tibble: 3 x 5 5 # Groups: Class [3] 6 ID Class Chinese Math English 7 8 1 6 3 89 99 46 9 2 7 1 94 38 87 10 3 8 2 66 77 95

5、select()函数 选择

select(.data, ...)

1 > select(df,ID,Chinese,Math,English) #选出df中ID、语文、数学、英语数据 2 ID Chinese Math English 3 1 1 65 59 23 4 2 2 37 38 45 5 3 3 65 76 67 6 4 4 90 49 87 7 5 5 20 71 34 8 6 6 89 99 46 9 7 7 94 38 87 10 8 8 66 77 95 11 9 9 62 93 43 12 10 10 20 21 76 13 11 11 20 65 23 14 12 12 20 12 94

6、rbind()函数与cbind()函数 合并

rbind()函数根据行进行合并,cbind()根据列进行合并

1 #新建数据框df1 2 > df1 df1 5 ID Class Chinese Math English 6 1 13 2 65 26 84 7 > rbind(df,df1) #合并df与df1 8 ID Class Chinese Math English 9 1 1 2 65 59 23 10 2 2 2 37 38 45 11 3 3 3 65 76 67 12 4 4 1 90 49 87 13 5 5 2 20 71 34 14 6 6 3 89 99 46 15 7 7 1 94 38 87 16 8 8 2 66 77 95 17 9 9 3 62 93 43 18 10 10 1 20 21 76 19 11 11 2 20 65 23 20 12 12 3 20 12 94 21 13 13 2 65 26 84 22 > df2 #新建数据框df2 23 Biological 24 1 65 25 2 15 26 3 35 27 4 59 28 5 64 29 6 34 30 7 29 31 8 46 32 9 32 33 10 95 34 11 46 35 12 23 36 > cbind(df,df2) #合并df与df2 37 ID Class Chinese Math English Biological 38 1 1 2 65 59 23 65 39 2 2 2 37 38 45 15 40 3 3 3 65 76 67 35 41 4 4 1 90 49 87 59 42 5 5 2 20 71 34 64 43 6 6 3 89 99 46 34 44 7 7 1 94 38 87 29 45 8 8 2 66 77 95 46 46 9 9 3 62 93 43 32 47 10 10 1 20 21 76 95 48 11 11 2 20 65 23 46 49 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()函数举例

1 #新建数据框Class 2 > Class Class 4 Class class 5 1 1 一班 6 2 2 二班 7 3 3 三班 8 > left_join(df,Class,by = 'Class') #基于Class变量左连接df与Class数据框 9 ID Class Chinese Math English class 10 1 1 2 65 59 23 二班 11 2 2 2 37 38 45 二班 12 3 3 3 65 76 67 三班 13 4 4 1 90 49 87 一班 14 5 5 2 20 71 34 二班 15 6 6 3 89 99 46 三班 16 7 7 1 94 38 87 一班 17 8 8 2 66 77 95 二班 18 9 9 3 62 93 43 三班 19 10 10 1 20 21 76 一班 20 11 11 2 20 65 23 二班 21 12 12 3 20 12 94 三班

left_join()函数仅保留df对应的Class值的数据

以上是关于data.frame数据框的一点学习总结,如有错误,敬请谅解。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3