R语⾔的四种数据结构---数据框
数据框是最常见的数据结构,⼀般来讲,从csv或txt⽂件读⼊时就会⾃动存储为数据框对象。
与矩阵不同的是,矩阵只可以存储⼀种数据类型,⽽数据框可以存储多种类型,但是每⼀列必须为相同的数据类型
1.创建数据框
(1)从外部读⼊
# 读⼊⼀个txt,csv等格式数据,即⾃成⼀个数据框
movie = read.csv("电影数据.csv", fileEncoding = "UTF-8", stringsAsFactors = F)
class(movie)
## [1] "data.frame"
(2)⾃⼰创建
# ⾃⼰创建
star1 = c("邓超", "赵丽颖", "郭富城", "周润发", "杰克布莱克", "汤唯", "⽩敬亭", "陈晓", "梁家辉", "姚晨", "宋茜", "黄宗泽", "黄晓明")
birthyear = c(1979, 1987, 1965, 1955, 1969, 1979, 1993, 1987, 1958, 1979, 1987, 1980, 1977)
gender = c("男", "⼥", "男", "男", "男", "⼥", "男", "男", "男", "⼥", "⼥", "男", "男")
# 使⽤head()函数可以提取数据的前六⾏
stars = data.frame(star1, birthyear, gender); head(stars)
## star1 birthyear gender
## 1 邓超 1979 男
## 2 赵丽颖 1987 ⼥
## 3 郭富城 1965 男
## 4 周润发 1955 男
## 5 杰克布莱克 1969 男
## 6 汤唯 1979 ⼥
2.汇总
str()函数⽤来展⽰每列的数据类型,可以确定是连续的数值好事离散的因⼦
summary()函数是清洗数据的必备之选,可⾃动根据数据类型调整输出结果。具体来说,对于连续数据,它能给出输出数据的分位数值,对于类别数据(以factor存储形式),它能给出输出每个类别的数⽬统计,这样,各类数据样本是否平衡就⼀⽬了然。
str(movie)
## 'data.frame': 19 obs. of 11 variables:
中国传统节日的来历## $ name : chr "叶问3" "美⼈鱼" "⼥汉⼦真爱公式" "西游记之孙悟空三打⽩⾻精" ... ## $ boxoffice : num 77060 338583 6184 119957 111694 ...
## $ doubanscore: num 6.4 6.9 4.5 5.7 4 7.7 6.5 6.4 5 5.6 ...
## $ type : chr "动作" "喜剧" "喜剧" "喜剧" ...
## $ duration : int 105 93 93 120 112 95 131 108 95 102 ...
## $ showtime : chr "2016/3/4" "2016/2/8" "2016/3/18" "2016/2/8" ...
## $ director : chr "叶伟信" "周星驰" "郭⼤雷" "郑保瑞" ...
## $ star1 : chr "甄⼦丹" "邓超" "赵丽颖" "郭富城" ...
## $ index1 : int 11385 41310 181979 12227 16731 178 13499 14759 13251 6911 ... ## $ star2 : chr "张晋" "林允" "张翰" "巩俐" ...
## $ index2 : int 4105 9292 44277 8546 30277 1540 77260 755 9549 5614 ... summary(movie)
## name boxoffice doubanscore type
## Length:19 Min. : 924.9 Min. :3.400 Length:19
## Class :character 1st Qu.: 3799.5 1st Qu.:4.600 Class :character
## Mode :character Median : 12561.5 Median :5.300 Mode :character
## Mean : 50813.3 Mean :5.568
吴奇隆资料## 3rd Qu.: 77700.9 3rd Qu.:6.450
## Max. :338583.3 Max. :8.000
## duration showtime director star1
## Min. : 84.0 Length:19 Length:19 Length:19
## 1st Qu.: 94.5 Class :character Class :character Class :character
## Median : 99.0 Mode :character Mode :character Mode :character
## Mean :101.5
## 3rd Qu.:107.5
## Max. :131.0
## index1 star2 index2
## Min. : 178 Length:19 Min. : 521
## 1st Qu.: 8232 Class :character 1st Qu.: 3650
## Median : 12227 Mode :character Median : 9292
## Mean : 27861 Mean :17369
## 3rd Qu.: 24663 3rd Qu.:20763
## Max. :181979 Max. :77260
head(movie)
## name boxoffice doubanscore type duration showtime
## 1 叶问3 77060.44 6.4 动作 105 2016/3/4
## 2 美⼈鱼 338583.26 6.9 喜剧 93 2016/2/8
## 3 ⼥汉⼦真爱公式 6184.45 4.5 喜剧 93 2016/3/18
## 4 西游记之孙悟空三打⽩⾻精 119956.51 5.7 喜剧 120 2016/2/8
## 5 澳门风云三 111693.89 4.0 喜剧 112 2016/2/8
## 6 功夫熊猫3 99832.53 7.7 喜剧 95 2016/1/29
## director star1 index1 star2 index2
## 1 叶伟信甄⼦丹 11385 张晋 4105
## 2 周星驰邓超 41310 林允 9292
## 3 郭⼤雷赵丽颖 181979 张翰 44277
## 4 郑保瑞郭富城 12227 巩俐 8546
## 5 王晶周润发 16731 刘德华 30277
## 6 吕寅荣杰克布莱克 178 安吉丽娜朱莉 1540
3.变⼤--数据框的增列、合并
# 添加⼀列数据prefer
prefer = 1:19
movie$pre = prefer
head(movie)
## name boxoffice doubanscore type duration showtime
## 1 叶问3 77060.44 6.4 动作 105 2016/3/4
## 2 美⼈鱼 338583.26 6.9 喜剧 93 2016/2/8
## 3 ⼥汉⼦真爱公式 6184.45 4.5 喜剧 93 2016/3/18
## 4 西游记之孙悟空三打⽩⾻精 119956.51 5.7 喜剧 120 2016/2/8
## 5 澳门风云三 111693.89 4.0 喜剧 112 2016/2/8
## 6 功夫熊猫3 99832.53 7.7 喜剧 95 2016/1/29
## director star1 index1 star2 index2 pre
## 1 叶伟信甄⼦丹 11385 张晋 4105 1
## 2 周星驰邓超 41310 林允 9292 2
## 3 郭⼤雷赵丽颖 181979 张翰 44277 3
## 4 郑保瑞郭富城 12227 巩俐 8546 4
## 5 王晶周润发 16731 刘德华 30277 5
## 6 吕寅荣杰克布莱克 178 安吉丽娜朱莉 1540 6
merge(x,y,by),其中x,y分别是要合并的两个数据框,by是它们共有的列。如果这两个共有的列在两个数据框中的名字不同,还需要通过by.x,by.y分别定义识别。另外,和数据库中中的操作类似,我们经常会发现两个数据框中匹配的值域并不相同,这事还需要⽤all类的参数设置以哪个所包含的值域为准。
# merge实现的效果是:将movie和stars按照列star1匹配并合并起来
(movie.star = merge(movie[1:3, ], stars,by = "star1"))
## star1 name boxoffice doubanscore type duration showtime
## 1 邓超美⼈鱼 338583.26 6.9 喜剧 93 2016/2/8
## 2 赵丽颖⼥汉⼦真爱公式 6184.45 4.5 喜剧 93 2016/3/18
## director index1 star2 index2 pre birthyear gender
## 1 周星驰 41310 林允 9292 2 1979 男
## 2 郭⼤雷 181979 张翰 44277 3 1987 ⼥
# all.x=T,即取前⼀个数据框movie中star1列所有的值做合并,匹配不到赋值NA
(movie.star = merge(movie[1:3, ], stars[1:5, ], by = "star1", all.x = T))
## star1 name boxoffice doubanscore type duration showtime
## 1 邓超美⼈鱼 338583.26 6.9 喜剧 93 2016/2/8
## 2 赵丽颖⼥汉⼦真爱公式 6184.45 4.5 喜剧 93 2016/3/18
## 3 甄⼦丹叶问3 77060.44 6.4 动作 105 2016/3/4
## director index1 star2 index2 pre birthyear gender
## 1 周星驰 41310 林允 9292 2 1979 男
## 2 郭⼤雷 181979 张翰 44277 3 1987 ⼥
## 3 叶伟信 11385 张晋 4105 1 NA <NA>
4.变⼩-数据的筛选、引⽤
(1)引⽤
movie[3, ] # 查看第3⾏的电影信息
## name boxoffice doubanscore type duration showtime director
## 3 ⼥汉⼦真爱公式 6184.45 4.5 喜剧 93 2016/3/18 郭⼤雷
## star1 index1 star2 index2 pre
## 3 赵丽颖 181979 张翰 44277 3
movie[, 8] # 查看第8列主演者的名字
## [1] "甄⼦丹" "邓超" "赵丽颖" "郭富城" "周润发"
## [6] "杰克布莱克" "汤唯" "⽩敬亭" "陈晓" "梁家辉"
## [11] "姚晨" "宋茜" "黄宗泽" "黄晓明" "洪⾦宝"
## [16] "陈坤" "陶泽如" "刘亦菲" "何润东"
(2)筛选
movie$star1 # ⽤$符号通过列名引⽤
## [1] "甄⼦丹" "邓超" "赵丽颖" "郭富城" "周润发"
## [6] "杰克布莱克" "汤唯" "⽩敬亭" "陈晓" "梁家辉"
## [11] "姚晨" "宋茜" "黄宗泽" "黄晓明" "洪⾦宝"
## [16] "陈坤" "陶泽如" "刘亦菲" "何润东"以翅膀为题的作文
(action = movie[movie$type == "动作", ]) # 选择数据中的动作电影
## name boxoffice doubanscore type duration showtime director
## 1 叶问3 77060.44 6.4 动作 105 2016/3/4 叶伟信
## 10 冰河追凶 4262.14 5.6 动作 102 2016/4/15 徐伟
## 15 我的特⼯爷爷 32009.37 5.3 动作 99 2016/4/1 洪⾦宝
## 19 钢⼑ 924.86 4.3 动作 94 2016/5/20 阿⽢
## star1 index1 star2 index2 pre
## 1 甄⼦丹 11385 张晋 4105 1
## 10 梁家辉 6911 佟⼤为 5614 10
## 15 洪⾦宝 9148 刘德华 30277 15
蝇蛆养殖视频
## 19 何润东 11822 李学东 521 19
(action_long = movie[movie$type == "动作" & movie$duration > 100, ]) # 放映时间超过100分钟的动作电影## name boxoffice doubanscore type duration showtime director star1
## 1 叶问3 77060.44 6.4 动作 105 2016/3/4 叶伟信甄⼦丹
## 10 冰河追凶 4262.14 5.6 动作 102 2016/4/15 徐伟梁家辉
## index1 star2 index2 pre
## 1 11385 张晋 4105 1
## 10 6911 佟⼤为 5614 10
5.变序--数据框的内部排序
(action_long = movie[movie$type == "动作" & movie$duration > 100, ]) # 放映时间超过100分钟的动作电影## name boxoffice doubanscore type duration showtime director star1
## 1 叶问3 77060.44 6.4 动作 105 2016/3/4 叶伟信甄⼦丹
## 10 冰河追凶 4262.14 5.6 动作 102 2016/4/15 徐伟梁家辉
## index1 star2 index2 pre
## 1 11385 张晋 4105 1
## 10 6911 佟⼤为 5614 10
# 先按电影类型排序,再按照⾖瓣评分排序
movie = movie[order(movie$type, movie$doubanscore, decreasing = T), ]; head(movie)
## name boxoffice doubanscore type duration showtime
## 6 功夫熊猫3 99832.53 7.7 喜剧 95 2016/1/29
## 2 美⼈鱼 338583.26 6.9 喜剧 93 2016/2/8
## 7 北京遇上西雅图之不⼆情书 78341.38 6.5 喜剧 131 2016/4/29
## 4 西游记之孙悟空三打⽩⾻精 119956.51 5.7 喜剧 120 2016/2/8
## 13 刑警兄弟 3005.96 5.2 喜剧 97 2016/4/22
## 3 ⼥汉⼦真爱公式 6184.45 4.5 喜剧 93 2016/3/18
## director star1 index1 star2 index2 pre
## 6 吕寅荣杰克布莱克 178 安吉丽娜朱莉 1540 6
## 2 周星驰邓超 41310 林允 9292 2
## 7 薛晓路汤唯 13499 吴秀波 77260 7
## 4 郑保瑞郭富城 12227 巩俐 8546 4
## 13 戚家基黄宗泽 9823 ⾦刚 4010 13
## 3 郭⼤雷赵丽颖 181979 张翰 44277 3
6.变形--长宽表互换
(1)宽表变长表
melt()函数是⼀个专门把宽表收起来,把多个列表变成⼀个变量下的属性函数。其中,参数id.vars⽤来设定把哪列定住不动,然后其他列就会⾃动收⼊这⼀列中;参数variable_name⽤来设定设个新列的列名。
下⽅代码就是以id.vars为基准,其他所有的原始变量都排成⼀个新列,然后原始列下⾯的数值就会被记录在⼀列新的value中。
# install.packages(reshape)
小米sd卡无法读取library(reshape)
# install.packages(reshape2)
library(reshape2)
## (1) 宽表变长表 ##
mWide = data.frame(Name = c("熊⼤", "⽔妈"), Type = c("帅哥", "美⼥"),
GF2013 = c(300, 100), GF2014 = c(500, 350), GF2015 = c(1000, 886))
# 由于构造数据框时列名不可以为纯数字,在数字前添加GF
# 将列名中的GF去掉
colnames(mWide)[3:5] = gsub("GF", "", colnames(mWide)[3:5])
mWide #查看原表
## Name Type 2013 2014 2015
## 1 熊⼤帅哥 300 500 1000
## 2 ⽔妈美⼥ 100 350 886
(mLong = melt(mWide, id.vars = c("Name", "Type"), variable_name = "Year"))
## Name Type Year value
## 1 熊⼤帅哥 2013 300
## 2 ⽔妈美⼥ 2013 100
麻辣牛肉## 3 熊⼤帅哥 2014 500
## 4 ⽔妈美⼥ 2014 350
## 5 熊⼤帅哥 2015 1000
## 6 ⽔妈美⼥ 2015 886
## (2) 长表变宽表 ##
# 将列Year从字符型变成数值型
mLong$Year = as.numeric(mLong$Year)
(2)长表变宽表
dcast()函数可将长表变为宽表,第⼀个参数是要变形的数据框,第⼆个参数采⽤了公⽰参数,公⽰的左边每个变量都会作为结果中的⼀列,⽽右边的变量被当成因⼦类型,每个⽔平值都会在结果中新⽣成⼀个单独列。
发布评论