R 菜鸟入门篇 第07篇 因子

前几篇举例子用的 PM2.5 数据来自十年前,这是因为 dapeng 手头碰巧有这么篇论文。今天偶尔发现,网上已经在公布最近国内城市的空气质量数据了,本篇就以北京和郑州两城市最近半个月的 PM2.5 数据举例子(数据来源 http://www.pm2d5.com/)。点击这里下载北京数据,这里下载郑州数据,请仍然保存在 _c:\R\data_ 文件夹下面。

bj <- read.csv(file = "c:\\R\\data\\dapengde_DummyR_PMBeijing.csv")
zz <- read.csv(file = "c:\\R\\data\\dapengde_DummyR_PMZhengzhou.csv")
bj$city <- "Beijing"
zz$city <- "Zhengzhou"
data <- rbind(bj, zz)  # 按行合并数据。
summary(data)
##       date             pm          city          
##  Min.   : 1.00   Min.   :  5   Length:37         
##  1st Qu.: 5.00   1st Qu.: 51   Class :character  
##  Median :10.00   Median : 75   Mode  :character  
##  Mean   : 9.76   Mean   : 95                     
##  3rd Qu.:14.00   3rd Qu.:115                     
##  Max.   :19.00   Max.   :280
str(data)
## &#39;data.frame&#39;:    37 obs. of  3 variables:
##  $ date: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ pm  : int  5 27 75 22 130 228 220 205 63 35 ...
##  $ city: chr  "Beijing" "Beijing" "Beijing" "Beijing" ...

啥是因子(factor)?因子,也可以叫做分类变量,就是对某个向量进行分组的向量。这么说起来很绕,还是举个例子吧。上面得到的数据框 data,其中 data$pm 有 36 个数值,可以按日期分成 18 组,也可以按城市分成两组,这个分组信息就是因子。目前,日期和城市两列数据还不是因子,而是整数和字符。要想转换成因子,就要这样:

data$city <- factor(data$city)
str(data)
## &#39;data.frame&#39;:    37 obs. of  3 variables:
##  $ date: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ pm  : int  5 27 75 22 130 228 220 205 63 35 ...
##  $ city: Factor w/ 2 levels "Beijing","Zhengzhou": 1 1 1 1 1 1 1 1 1 1 ...

现在,data$city 是个因子了。因子的取值叫做“水平”(level)。看看因子有几个水平,水平分别是什么:

nlevels(data$city)
## [1] 2
levels(data$city)
## [1] "Beijing"   "Zhengzhou"

因子有什么用呢?当然就是用来对数据分类了。请看下面的例子:

plot(x = data$city, y = data$pm)  # 当x是因子时,plot自动画出箱型图。等同于boxplot(data$pm ~ data$city)

plot of chunk unnamed-chunk-4

练习07.1 把示例数据中的日期列转换成因子,并按日期分类做出箱型图。
# 分别计算两地最近18天的PM2.5平均值。
for (i in levels(data$city)) {
    print(i)
    print(mean(data$pm[data$city == i]))
}
## [1] "Beijing"
## [1] 124.7
## [1] "Zhengzhou"
## [1] 66.79
tapply(data$pm, data$city, mean)  # 跟上一条循环指令的作用相同。懒人的福音又来了!
##   Beijing Zhengzhou 
##    124.72     66.79

dapeng 是太喜欢 tapply()了。以前处理过这么个数据文件,有两列,第一列是日期,第二列是日均气温值,每天一行,总共一年,365 行,需要计算月平均气温。因为各月的天数是不同的,dapeng 只好在 Excel 里用鼠标拖,或者数单元格的位置,一共算了 12 次,还庆幸幸好只有 365 行。后来才知道 Excel 有“数据透视表”这个东西,但仍然觉得不灵活。现在有了 R,只要增加一列月份因子(方法以后专门介绍),一条 ‘tapply()’ 就搞定,就算是有三万六千行,也不费吹灰之力了。

练习07.2 用tapply()和示例数据,分别计算北京和郑州两城市最近 PM2.5 日均值的最大值、最小值、中值。

有用的信息:

按行合并数据 rbind
因子 factor(), nlevels(), levels()
分类计算 tapply()

( 连载中,待续 )

原文链接

comments powered by Disqus