其他
R Tips :split 函数
R Tips :split 函数
介绍
split 函数是 R base 环境里的函数,注意不是字符串切割
那个函数。之前总会把 strsplit 函数和这个搞混,今天来学习一下这个函数。该函数根据向量或因子来对数据或者向量进行分组
,首先我们看看帮助文档:
?split()
######################
Description
split divides the data in the vector x into the groups defined by f. The replacement forms replace values corresponding to such a division. unsplit reverses the effect of split.
Usage
split(x, f, drop = FALSE, ...)
## Default S3 method:
split(x, f, drop = FALSE, sep = ".", lex.order = FALSE, ...)
split(x, f, drop = FALSE, ...) <- value
unsplit(value, f, drop = FALSE)
参数介绍:
1、x: 需要被分组的向量或者数据框
2、f: 定义分组的因子或 list
3、drop: 逻辑值,如果 f 中的因子没被用到就丢弃掉
4、value: 一个用于储存 split 函数分组结果的 list
5、sep: 字符串,用于 f 中有多个因子 list 类型的 list 名字的连接符号
使用
# 加载测试数据
data("mtcars")
head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
# 查看cyl列有哪几种类型
table(mtcars$cyl)
4 6 8
11 7 14
# 根据cyl列切分,返回的是一个list,每个list名字为分组水平
$`4`
mpg 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
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
...
$`6`
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
...
$`8`
mpg cyl disp hp drat wt qsec vs am gear carb
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
...
# 根据cyl和gear列切分,以下划线'_'连接
split(mtcars,list(mtcars$cyl,mtcars$gear),sep = '_')
$`4_3`
mpg cyl disp hp drat wt qsec vs am gear carb
Toyota Corona 21.5 4 120.1 97 3.7 2.465 20.01 1 0 3 1
$`6_3`
mpg cyl disp hp drat wt qsec vs am gear carb
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
$`8_3`
mpg cyl disp hp drat wt qsec vs am gear carb
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
...
$`4_4`
mpg 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
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
...
$`6_4`
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
...
$`8_4`
[1] mpg cyl disp hp drat wt qsec vs am gear carb
<0 行> (或0-长度的row.names)
$`4_5`
mpg cyl disp hp drat wt qsec vs am gear carb
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
$`6_5`
mpg cyl disp hp drat wt qsec vs am gear carb
Ferrari Dino 19.7 6 145 175 3.62 2.77 15.5 0 1 5 6
$`8_5`
mpg cyl disp hp drat wt qsec vs am gear carb
Ford Pantera L 15.8 8 351 264 4.22 3.17 14.5 0 1 5 4
Maserati Bora 15.0 8 301 335 3.54 3.57 14.6 0 1 5 8
对向量分割,后面可以接 map、lapply、sapply 等函数进行进一步操作:
# 对cyl列分组,获得mpg的值
split(mtcars$mpg,mtcars$cyl)
$`4`
[1] 22.8 24.4 22.8 32.4 30.4 33.9 21.5 27.3 26.0 30.4 21.4
$`6`
[1] 21.0 21.0 21.4 18.1 19.2 17.8 19.7
$`8`
[1] 18.7 14.3 16.4 17.3 15.2 10.4 10.4 14.7 15.5 15.2 13.3 19.2 15.8 15.0
# 对4、6、8三个水平的mpg计算平均值
sapply(split(mtcars$mpg,mtcars$cyl), mean)
4 6 8
26.66364 19.74286 15.10000
# 计算最小值
lapply(split(mtcars$mpg,mtcars$cyl), min)
$`4`
[1] 21.4
$`6`
[1] 17.8
$`8`
[1] 10.4
# 计算标准差
map_dbl(split(mtcars$mpg,mtcars$cyl), sd)
4 6 8
4.509828 1.453567 2.560048
# 两个因子分组
split(mtcars$mpg,list(mtcars$cyl,mtcars$gear),sep = '_')
$`4_3`
[1] 21.5
$`6_3`
[1] 21.4 18.1
$`8_3`
[1] 18.7 14.3 16.4 17.3 15.2 10.4 10.4 14.7 15.5 15.2 13.3 19.2
$`4_4`
[1] 22.8 24.4 22.8 32.4 30.4 33.9 27.3 21.4
$`6_4`
[1] 21.0 21.0 19.2 17.8
$`8_4`
numeric(0)
$`4_5`
[1] 26.0 30.4
$`6_5`
[1] 19.7
$`8_5`
[1] 15.8 15.0
# 计算均值,NaN是那个类型的数据不存在
sapply(split(mtcars$mpg,list(mtcars$cyl,mtcars$gear)), mean)
4.3 6.3 8.3 4.4 6.4 8.4 4.5 6.5 8.5
21.500 19.750 15.050 26.925 19.750 NaN 28.200 19.700 15.400
感觉这样的话其实 dplyr 完全可以干这个事情,会更加方便一些:
library(dplyr)
# 对mpg按cyl和gear分组计算均值
mtcars %>% group_by(cyl,gear) %>%
summarise(mean_mpg = mean(mpg))
`summarise()` has grouped output by 'cyl'. You can override using the `.groups` argument.
# A tibble: 8 x 3
# Groups: cyl [3]
cyl gear mean_mpg
<dbl> <dbl> <dbl>
1 4 3 21.5
2 4 4 26.9
3 4 5 28.2
4 6 3 19.8
5 6 4 19.8
6 6 5 19.7
7 8 3 15.0
8 8 5 15.4
# 对mpg、disp按cyl和gear分组计算均值、标准差和最小值
mtcars %>% group_by(cyl,gear) %>%
summarise(mean_mpg = mean(mpg),sd_mpg = sd(mpg),min_disp = min(disp))
`summarise()` has grouped output by 'cyl'. You can override using the `.groups` argument.
# A tibble: 8 x 5
# Groups: cyl [3]
cyl gear mean_mpg sd_mpg min_disp
<dbl> <dbl> <dbl> <dbl> <dbl>
1 4 3 21.5 NA 120.
2 4 4 26.9 4.81 71.1
3 4 5 28.2 3.11 95.1
4 6 3 19.8 2.33 225
5 6 4 19.8 1.55 160
6 6 5 19.7 NA 145
7 8 3 15.0 2.77 276.
8 8 5 15.4 0.566 301
- END -欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,打赏一下吧!