第8次课—R外部文件、Dataframe操作

黄利东

29/04/2021

R读取csv文件

-逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值),其文件以纯文本形式存储表格数据(数字和文本)

-CSV是一种通用的、相对简单的文件格式,最广泛的应用是在程序之间转移表格数据

-Excel处理后的数据可以另存为CSV文件(见图8-1)

-R可以非常容易地读取CSV文件

图8-1:Excel文件另存为csv文件

R读取csv文档

-首先制定你想要读入的csv文档位置,一般而言我们需要把某个项目的全部文件都放在同一文件夹中进行处理。然后,你让R访问这个文件夹就可以实现文件交互操作。

-ctrl+shift+H 快捷键组合可以制定工作路径(你想利用R访问文件的文件夹地址)

-我已在R设定好我刚才存放csv文件的位置,你也需要这样做!

> setwd("C:/Users/lidong/Desktop/")#ctrl+shift+H
> diamonds <- read.csv("diamonds.csv")#通过read.csv函数读入文件,双引号的字符串是你的文件名,必须和你保存的文件名一致,此处建议通过复制操作实现
> class(diamonds)#"data.frame" 数据框是R存储数据的核心,相当于Excel的一个sheet
## [1] "data.frame"

data.frame的索引

-与矩阵索引类似,可以通过[i,j]寻址第i行,第j列

-可以通过美元符号$索引

-还可以通过[[]]方括号嵌套索引列,比如data[[2]]就是data数据内的第二列

> #diamonds$carat #数据太长 我通过#批注,操作时把前面的#号去掉
> #diamonds[[2]]

data.frame的列名和行名

通过函数colnames()或names()返回数据框的列名称,通过函数rownames()返回数据框的行名称

> colnames(diamonds)
##  [1] "carat"   "cut"     "color"   "clarity" "depth"   "table"   "price"  
##  [8] "x"       "y"       "z"
> names(diamonds)
##  [1] "carat"   "cut"     "color"   "clarity" "depth"   "table"   "price"  
##  [8] "x"       "y"       "z"
> #rownames(diamonds) #太长,自己去掉第一个#试试看

R中内置的数据框类型数据集

-数据框

airquality #纽约1973年5-9月每日空气质量

anscombe #四组x-y数据,虽有相似的统计量,但实际数据差别较大

attenu #多个观测站对加利福尼亚23次地震的观测数据

attitude #30个部门在七个方面的调查结果,调查结果是同一部门35个职员赞成的百分比

beaver1 #一只海狸每10分钟的体温数据,共114条数据

beaver2 #另一只海狸每10分钟的体温数据,共100条数据

BOD #随水质的提高,生化反应对氧的需求(mg/l)随时间(天)的变化

cars #1920年代汽车速度对刹车距离的影响

chickwts #不同饮食种类对小鸡生长速度的影响

esoph #法国的一个食管癌病例对照研究

faithful #一个间歇泉的爆发时间和持续时间

Formaldehyde #两种方法测定甲醛浓度时分光光度计的读数

Freeny #每季度收入和其他四因素的记录

dating from #配对的病例对照数据,用于条件logistic回归

InsectSprays #使用不同杀虫剂时昆虫数目

iris #3种鸢尾花形态数据

LifeCycleSavings #50个国家的存款率

longley #强共线性的宏观经济数据

morley #光速测量试验数据

mtcars #32辆汽车在11个指标上的数据

OrchardSprays #使用拉丁方设计研究不同喷雾剂对蜜蜂的影响

PlantGrowth #三种处理方式对植物产量的影响

pressure #温度和气压

Puromycin #两种细胞中辅因子浓度对酶促反应的影响

quakes #1000次地震观测数据(震级>4)

randu #在VMS1.5中使用FORTRAN中的RANDU三个一组生成随机数字,共400组。

rock #48块石头的形态数据

sleep #两药物的催眠效果

stackloss #化工厂将氨转为硝酸的数据

swiss #瑞士生育率和社会经济指标

ToothGrowth #VC剂量和摄入方式对豚鼠牙齿的影响

trees #树木形态指标

USArrests #美国50个州的四个犯罪率指标

USJudgeRatings #43名律师的12个评价指标

warpbreaks #织布机异常数据

women #15名女性的身高和体重

以mtcars为例查看data.frame的维度

> ?mtcars
> mydata <- mtcars#为避免直接对mtcars操作
> nrow(mydata)#行数
## [1] 32
> ncol(mydata)#列数
## [1] 11
> dim(mydata)#行、列数
## [1] 32 11

data.frame行名和列名的修改

> colnames(mydata)#本质上是向量,可以利用向量操作对其修改
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
> colnames(mydata)[1] <- "gas_consumption"
> colnames(mydata)
##  [1] "gas_consumption" "cyl"             "disp"            "hp"             
##  [5] "drat"            "wt"              "qsec"            "vs"             
##  [9] "am"              "gear"            "carb"
> rownames(mydata)[1] <- "Ma.zi.da"
> rownames(mydata)
##  [1] "Ma.zi.da"            "Mazda RX4 Wag"       "Datsun 710"         
##  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
##  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
## [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
## [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
## [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
## [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
## [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
## [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
## [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
## [31] "Maserati Bora"       "Volvo 142E"

data.frame条件筛选与內部子集提取

> mydata[which(mydata$vs==1),]#筛选直列发动机排列的汽车
##                gas_consumption cyl  disp  hp drat    wt  qsec vs am gear carb
## Datsun 710                22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive            21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Valiant                   18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Merc 240D                 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230                  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280                  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C                 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Fiat 128                  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic               30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla            33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona             21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Fiat X1-9                 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Lotus Europa              30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Volvo 142E                21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
> mydata$vs==1
##  [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
## [25] FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE
> which(mydata$vs==1)#which()是找哪一个位置的逻辑值为TRUE
##  [1]  3  4  6  8  9 10 11 18 19 20 21 26 28 32
> subset(mydata,vs==1&am==1)#发动机直排并且是手动档的汽车
##                gas_consumption cyl  disp  hp drat    wt  qsec vs am gear carb
## Datsun 710                22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Fiat 128                  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic               30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla            33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Fiat X1-9                 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Lotus Europa              30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Volvo 142E                21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

根据发动机排列类型(vs)和挡位数(gear)的组合计算各汽车的平均性能

> options(digits = 3)
> aggregate(mydata,by=list(mydata$vs,mydata$gear),mean)
##   Group.1 Group.2 gas_consumption  cyl  disp    hp drat   wt qsec vs  am gear
## 1       0       3            15.1 8.00 357.6 194.2 3.12 4.10 17.1  0 0.0    3
## 2       1       3            20.3 5.33 201.0 104.0 3.18 3.05 19.9  1 0.0    3
## 3       0       4            21.0 6.00 160.0 110.0 3.90 2.75 16.7  0 1.0    4
## 4       1       4            25.2 4.40 115.6  85.4 4.07 2.59 19.4  1 0.6    4
## 5       0       5            19.1 6.50 229.3 216.2 3.95 2.91 15.3  0 1.0    5
## 6       1       5            30.4 4.00  95.1 113.0 3.77 1.51 16.9  1 1.0    5
##   carb
## 1 3.08
## 2 1.00
## 3 4.00
## 4 2.00
## 5 5.00
## 6 2.00
> names(diamonds)#随时查看表格中列名,字段或变量名
##  [1] "carat"   "cut"     "color"   "clarity" "depth"   "table"   "price"  
##  [8] "x"       "y"       "z"
> report.table <- aggregate(diamonds[,-c(2:4)],by=list(diamonds$cut,diamonds$color),mean)#对能求平均值的求平均
> report.table
##      Group.1 Group.2 carat depth table price    x    y    z
## 1       Fair       D 0.920  64.0  59.0  4291 6.02 5.96 3.84
## 2       Good       D 0.745  62.4  58.5  3405 5.62 5.63 3.50
## 3      Ideal       D 0.566  61.7  56.0  2629 5.19 5.20 3.20
## 4    Premium       D 0.722  61.2  58.7  3631 5.60 5.57 3.42
## 5  Very Good       D 0.696  61.8  58.0  3470 5.50 5.53 3.41
## 6       Fair       E 0.857  63.3  59.4  3682 5.91 5.86 3.72
## 7       Good       E 0.745  62.2  58.8  3424 5.62 5.63 3.50
## 8      Ideal       E 0.578  61.7  56.0  2598 5.22 5.23 3.22
## 9    Premium       E 0.718  61.2  58.8  3539 5.59 5.56 3.41
## 10 Very Good       E 0.676  61.7  58.0  3215 5.43 5.46 3.37
## 11      Fair       F 0.905  63.5  59.5  3827 5.99 5.93 3.79
## 12      Good       F 0.776  62.2  58.9  3496 5.69 5.71 3.54
## 13     Ideal       F 0.656  61.7  55.9  3375 5.41 5.42 3.34
## 14   Premium       F 0.827  61.3  58.7  4325 5.88 5.84 3.59
## 15 Very Good       F 0.741  61.7  57.8  3779 5.61 5.64 3.47
## 16      Fair       G 1.024  64.3  58.8  4239 6.17 6.11 3.96
## 17      Good       G 0.851  62.5  58.5  4123 5.85 5.86 3.65
## 18     Ideal       G 0.701  61.7  55.9  3721 5.51 5.52 3.40
## 19   Premium       G 0.841  61.3  58.7  4501 5.86 5.83 3.58
## 20 Very Good       G 0.767  61.8  57.8  3873 5.66 5.69 3.51
## 21      Fair       H 1.219  64.6  58.7  5136 6.58 6.50 4.22
## 22      Good       H 0.915  62.5  58.6  4276 5.97 5.97 3.73
## 23     Ideal       H 0.800  61.7  56.0  3889 5.73 5.74 3.54
## 24   Premium       H 1.016  61.3  58.8  5217 6.24 6.23 3.81
## 25 Very Good       H 0.916  62.0  57.9  4535 5.98 6.01 3.71
## 26      Fair       I 1.198  64.2  59.2  4685 6.56 6.49 4.19
## 27      Good       I 1.057  62.5  58.8  5079 6.25 6.26 3.90
## 28     Ideal       I 0.913  61.8  56.0  4452 5.98 5.99 3.70
## 29   Premium       I 1.145  61.3  58.8  5946 6.49 6.45 3.96
## 30 Very Good       I 1.047  61.9  58.1  5256 6.27 6.30 3.89
## 31      Fair       J 1.341  64.4  58.9  4976 6.75 6.68 4.32
## 32      Good       J 1.100  62.4  58.8  4574 6.38 6.39 3.98
## 33     Ideal       J 1.064  61.8  56.0  4918 6.32 6.33 3.91
## 34   Premium       J 1.293  61.4  58.9  6295 6.81 6.77 4.17
## 35 Very Good       J 1.133  61.9  58.3  5104 6.46 6.50 4.01
> library(reshape)
> names(diamonds)
##  [1] "carat"   "cut"     "color"   "clarity" "depth"   "table"   "price"  
##  [8] "x"       "y"       "z"
> cast(diamonds,cut~color,mean,value = names(diamonds)[1])#cast 是数据变形的函数
##         cut     D     E     F     G     H     I    J
## 1      Fair 0.920 0.857 0.905 1.024 1.219 1.198 1.34
## 2      Good 0.745 0.745 0.776 0.851 0.915 1.057 1.10
## 3     Ideal 0.566 0.578 0.656 0.701 0.800 0.913 1.06
## 4   Premium 0.722 0.718 0.827 0.841 1.016 1.145 1.29
## 5 Very Good 0.696 0.676 0.741 0.767 0.916 1.047 1.13

数据变形函数的用法

数据变形和融合是数据处理所需要的,R中有“成千上万”种数据变形手段,reshape包是非常基础的,理解reshape包的逻辑对学好其他方式有帮助。

图8-2:reshape包中melt和cast函数的用法示意图