split+lapply组合

2020-03-15  本文已影响0人  鱼啸九天

学习了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
上一篇下一篇

猜你喜欢

热点阅读