查看原文
其他

R Tips :split 函数

JunJunLab 老俊俊的生信笔记 2022-08-15

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`
 [122.8 24.4 22.8 32.4 30.4 33.9 21.5 27.3 26.0 30.4 21.4

$`6`
[121.0 21.0 21.4 18.1 19.2 17.8 19.7

$`8`
 [118.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`
[121.4

$`6`
[117.8

$`8`
[110.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`
[121.5

$`6_3`
[121.4 18.1

$`8_3`
 [118.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`
[122.8 24.4 22.8 32.4 30.4 33.9 27.3 21.4

$`6_4`
[121.0 21.0 19.2 17.8

$`8_4`
numeric(0)

$`4_5`
[126.0 30.4

$`6_5`
[119.7

$`8_5`
[115.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 -

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,打赏一下吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存