前几篇举例子用的 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)
## 'data.frame': 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)
## 'data.frame': 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)
练习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() |
( 连载中,待续 )