学习了R一段时间,感觉R做的应该是批量,虽然有for循环,apply等函数,但感觉split+lapply组合好理解一些。
split()所做的是接收一个向量或对象x,然后接收一个因子变量f,f用来指定分组的水平(level),x根据f进行分组,分组之后返回一个列表,我们就可以对这些独立的组使用lapply()。
生成三组随机数,然后通过split()进行分组,因子变量设置为3,将x向量分解成3组。
x <- c(rnorm(10), runif(10),rnorm(10,1))
f<- gl(3,10)
split(x,f)
$`1`
[1] 0.31205453 -0.05808672 0.08195985 1.02003807 1.67009113 -0.34806748 1.31506783
[8] 3.91626875 -1.30482693 1.80152419
$`2`
[1] 0.33053769 0.95732387 0.41466116 0.08654552 0.85751283 0.38291069 0.87297021
[8] 0.44570715 0.47098875 0.45451860
$`3`
[1] 0.0470334 1.1493512 1.5868259 1.2923148 0.2084253 1.2322888 1.8852816
[8] 2.0504138 -0.5446027 1.7317540
分组之后使用循环函数lapply求每个组中的统计值
lapply(split(x,f),mean)
$`1`
[1] 0.8406023
$`2`
[1] 0.5273676
$`3`
[1] 1.063909
当然,组合在实际中应用最多的还是数据框,以datasets数据集中的空气质量(airquality)数据集为例,可以看到数据集中包含臭氧、太阳辐射、风力、温度等测量值,以及月份、日期两个测量时间。
library(datasets)
head(airquality)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
如果想计算臭氧、辐射、风力、温度等测量值在某个月份内的平均值,那就要先使用split对数据进行分类:首先将整个数据框按月分组。然后在进行批量处理。
s <- split(airquality, airquality$Month)
lapply(s, function(x) {colMeans(x[, c("Ozone", "Solar.R", "Wind")])})
$`5`
Ozone Solar.R Wind
NA NA 11.62258
$`6`
Ozone Solar.R Wind
NA 190.16667 10.26667
$`7`
Ozone Solar.R Wind
NA 216.483871 8.941935
$`8`
Ozone Solar.R Wind
NA NA 8.793548
$`9`
Ozone Solar.R Wind
NA 167.4333 10.1800