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()函数可将长表变为宽表,第⼀个参数是要变形的数据框,第⼆个参数采⽤了公⽰参数,公⽰的左边每个变量都会作为结果中的⼀列,⽽右边的变量被当成因⼦类型,每个⽔平值都会在结果中新⽣成⼀个单独列。