时间:2021-05-20
前言:近段时间学习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 English1 1 1 26 68 262 2 2 37 38 383 3 3 57 76 14 4 1 90 49 385 5 2 20 71 866 6 3 89 99 347 7 1 94 38 488 8 2 66 77 599 9 3 62 93 4910 10 1 6 21 1811 11 2 20 65 8212 12 3 17 12 66可通过 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 17data.frame[列号] 得到一个仅包含该列内容的数据框
> df[3] Chinese1 262 373 574 905 206 897 948 669 6210 611 2012 17若要查找符合条件的行,可采用 which() 函数,得到的类型是数据框
> df[which(df$ID == 4),] ID Class Chinese Math English4 4 1 90 49 38可通过 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号同学英语成绩先由26修改为73,再修改为23)
> df ID Class Chinese Math English1 1 2 65 59 232 2 2 37 38 453 3 3 57 76 674 4 1 90 49 875 5 2 20 71 346 6 3 89 99 467 7 1 94 38 878 8 2 66 77 959 9 3 62 93 4310 10 1 6 21 7611 11 2 20 65 2312 12 3 17 12 94直接将需要修改后的值赋给上述查询某一个值的操作即可
> df[3,'Chinese'] <- 65 #将3号同学的语文成绩修改为65#将语文成绩低于20的同学的语文成绩修改为20> df[which(df$Chinese < 20),'Chinese'] <- 20> df ID Class Chinese Math English1 1 2 65 59 232 2 2 37 38 453 3 3 65 76 674 4 1 90 49 875 5 2 20 71 346 6 3 89 99 467 7 1 94 38 878 8 2 66 77 959 9 3 62 93 4310 10 1 20 21 7611 11 2 20 65 2312 12 3 20 12 94可用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 English1 1 65 232 2 37 453 3 65 674 4 90 875 5 20 346 6 89 467 7 94 878 8 66 959 9 62 4310 10 20 7611 11 20 2312 12 20 94#删除df第3行 ( df <- df[-3,] )> df.tmp <- df[-3,]> df.tmp ID Class Chinese Math English1 1 2 65 59 232 2 2 37 38 454 4 1 90 49 875 5 2 20 71 346 6 3 89 99 467 7 1 94 38 878 8 2 66 77 959 9 3 62 93 4310 10 1 20 21 7611 11 2 20 65 2312 12 3 20 12 94data.frame[新行号,] <- 行值
> df[13,] <- c(13,2,62,19,38) #新增13行数据> df ID Class Chinese Math English1 1 2 65 59 232 2 2 37 38 453 3 3 65 76 674 4 1 90 49 875 5 2 20 71 346 6 3 89 99 467 7 1 94 38 878 8 2 66 77 959 9 3 62 93 4310 10 1 20 21 7611 11 2 20 65 2312 12 3 20 12 9413 13 2 62 19 38若想对行进行复制,可以采用重复行号的方法
> df <- df[c(1,1:12),] #复制第1行1次> df ID Class Chinese Math English1 1 2 65 59 231.1 1 2 65 59 232 2 2 37 38 453 3 3 65 76 674 4 1 90 49 875 5 2 20 71 346 6 3 89 99 467 7 1 94 38 878 8 2 66 77 959 9 3 62 93 4310 10 1 20 21 7611 11 2 20 65 2312 12 3 20 12 94可使用rep()函数方便进行多行的复制
> df <- df[rep(1:12,each = 2),] #对每行数据复制1次> df ID Class Chinese Math English1 1 2 65 59 231.1 1 2 65 59 232 2 2 37 38 452.1 2 2 37 38 453 3 3 65 76 673.1 3 3 65 76 674 4 1 90 49 874.1 4 1 90 49 875 5 2 20 71 345.1 5 2 20 71 346 6 3 89 99 466.1 6 3 89 99 467 7 1 94 38 877.1 7 1 94 38 878 8 2 66 77 958.1 8 2 66 77 959 9 3 62 93 439.1 9 3 62 93 4310 10 1 20 21 7610.1 10 1 20 21 7611 11 2 20 65 2311.1 11 2 20 65 2312 12 3 20 12 9412.1 12 3 20 12 94还可采用rbind()函数,后续会有示例
data.frame$新列名 <- 列值
> df$Physics <- c(23,34,67,23,56,67,78,23,54,56,67,34)> df ID Class Chinese Math English Physics1 1 2 65 59 23 232 2 2 37 38 45 343 3 3 65 76 67 674 4 1 90 49 87 235 5 2 20 71 34 566 6 3 89 99 46 677 7 1 94 38 87 788 8 2 66 77 95 239 9 3 62 93 43 5410 10 1 20 21 76 5611 11 2 20 65 23 6712 12 3 20 12 94 34data.frame[,新列号] <- 列值
> df[,7] <- c(1:12)> df ID Class Chinese Math English Physics V71 1 2 65 59 23 23 12 2 2 37 38 45 34 23 3 3 65 76 67 67 34 4 1 90 49 87 23 45 5 2 20 71 34 56 56 6 3 89 99 46 67 67 7 1 94 38 87 78 78 8 2 66 77 95 23 89 9 3 62 93 43 54 910 10 1 20 21 76 56 1011 11 2 20 65 23 67 1112 12 3 20 12 94 34 12还可用dplyr包中的mutate()函数
> mutate(df,Chemistry = Chinese + Math + English + Physics) ID Class Chinese Math English Physics V7 Chemistry1 1 2 65 59 23 23 1 1702 2 2 37 38 45 34 2 1543 3 3 65 76 67 67 3 2754 4 1 90 49 87 23 4 2495 5 2 20 71 34 56 5 1816 6 3 89 99 46 67 6 3017 7 1 94 38 87 78 7 2978 8 2 66 77 95 23 8 2619 9 3 62 93 43 54 9 25210 10 1 20 21 76 56 10 17311 11 2 20 65 23 67 11 17512 12 3 20 12 94 34 12 160还可采用cbind()函数,后续会有示例
函数中第一个是待排序的数据框,之后依次是变量,且变量优先级逐渐降低,如语文、数学成绩进行排序
> arrange(df,Chinese,Math) #依次按语文、数学成绩由小到大排序 ID Class Chinese Math English1 12 3 20 12 942 10 1 20 21 763 11 2 20 65 234 5 2 20 71 345 2 2 37 38 456 9 3 62 93 437 1 2 65 59 238 3 3 65 76 679 8 2 66 77 9510 6 3 89 99 4611 4 1 90 49 8712 7 1 94 38 87若想由大到小排序,使用desc()函数
> arrange(df,desc(Chinese)) #按语文成绩由大到小排序 ID Class Chinese Math English1 7 1 94 38 872 4 1 90 49 873 6 3 89 99 464 8 2 66 77 955 1 2 65 59 236 3 3 65 76 677 9 3 62 93 438 2 2 37 38 459 5 2 20 71 3410 10 1 20 21 7611 11 2 20 65 2312 12 3 20 12 94group_by()与summarise()函数常连用,用于对不同的分组进行操作,在这里再介绍一个管道函数“%>%”,其作用是把左件的值发送给右件的表达式,并作为右件表达式函数的第一个参数
> df %>%+ group_by(Class) %>%+ summarise(max = max(Chinese)) #求出按Class分组每组中语文成绩最高分# A tibble: 3 x 2 Class max <dbl> <dbl>1 1 942 2 663 3 89选出符合条件的行(返回数据框格式)
> 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 462 7 1 94 38 873 8 2 66 77 95rbind()函数根据行进行合并,cbind()根据列进行合并
#新建数据框df1> df1 <- data.frame(ID = 13,Class = 2,Chinese = 65,Math = 26,English = 84)> df1 ID Class Chinese Math English1 13 2 65 26 84> rbind(df,df1) #合并df与df1 ID Class Chinese Math English1 1 2 65 59 232 2 2 37 38 453 3 3 65 76 674 4 1 90 49 875 5 2 20 71 346 6 3 89 99 467 7 1 94 38 878 8 2 66 77 959 9 3 62 93 4310 10 1 20 21 7611 11 2 20 65 2312 12 3 20 12 9413 13 2 65 26 84> df2 #新建数据框df2 Biological1 652 153 354 595 646 347 298 469 3210 9511 4612 23> cbind(df,df2) #合并df与df2 ID Class Chinese Math English Biological1 1 2 65 59 23 652 2 2 37 38 45 153 3 3 65 76 67 354 4 1 90 49 87 595 5 2 20 71 34 646 6 3 89 99 46 347 7 1 94 38 87 298 8 2 66 77 95 469 9 3 62 93 43 3210 10 1 20 21 76 9511 11 2 20 65 23 4612 12 3 20 12 94 23join函数类型比较多,这里仅以left_join()函数举例
#新建数据框Class> Class <- data.frame(Class = c(1,2,3),class = c('一班','二班','三班'))> Class Class class1 1 一班2 2 二班3 3 三班> left_join(df,Class,by = 'Class') #基于Class变量左连接df与Class数据框 ID Class Chinese Math English class1 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值的数据
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
对于那些有一点编程经验的人来说,vector,matrix,array,list,data.frame就相当于编程语言中的容器,因为只是将R看做数据处理工具所以
本文主要介绍了R语言中矩阵matrix和数据框data.frame的一些使用,分享给大家,具体如下:"一,矩阵matrix""创建向量"x_1=c(1,2,3)
同expand.grid()一样,data.frame()也是一个生产数据框的命令不同的是,两者产生的结果,要求不一样data.frame()的命令,如data
mergedataframes(inner,outer,left,right)数据>df1=data.frame(CustomerId=c(1:6),Produ
如下所示:library(ggplot2)library(ggthemes)dt=data.frame(obj=c('A','D','B','E','C'),v