1.准备工作
重点:使用list列保存任意数据结构
library(modelr)
library(tidyverse)
#> ── Attaching packages ───────────────────────────────── tidyverse 1.2.1 ──
#> ✔ ggplot2 3.0.0 ✔ purrr 0.2.5
#> ✔ tibble 1.4.2 ✔ dplyr 0.7.6
#> ✔ tidyr 0.8.1 ✔ stringr 1.3.1
#> ✔ readr 1.1.1 ✔ forcats 0.3.0
#> ── Conflicts ──────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag() masks stats::lag()
2.list列
用tribble()新建--只是帮助理解
tribble(
~x, ~y,
1:3, "1, 2",
3:5, "3, 4, 5"
)
#> # A tibble: 2 x 2
#> x y
#> <list> <chr>
#> 1 <int [3]> 1, 2
#> 2 <int [3]> 3, 4, 5
3.创建list列
普遍方法:
(1) tidyr::nest()
将分组数据框转换为嵌套数据框,嵌套数据框中会包含【数据框列表】列。
(2) mutate()以及能够返回列表的向量化函数。
(3) summarize()以及能够返回多个结果的摘要函数。
另外,我们还可以使用
tibble::enframe()函数根据命名列表来创建列表列。
(1)nest
帮助文档中的例子
as_tibble(iris) %>% nest(-Species)
#> # A tibble: 3 x 2
#> Species data
#> <fct> <list>
#> 1 setosa <tibble [50 × 4]>
#> 2 versicolor <tibble [50 × 4]>
#> 3 virginica <tibble [50 × 4]>
(2)使用向量化函数
嵌套--拆分字符串mutate和str_split联用
df <- tribble(
~x1,
"a,b,c",
"d,e,f,g"
)
df %>%
mutate(x2 = stringr::str_split(x1, ","))
#> # A tibble: 2 x 2
#> x1 x2
#> <chr> <list>
#> 1 a,b,c <chr [3]>
#> 2 d,e,f,g <chr [4]>
嵌套还原
df %>%
mutate(x2 = stringr::str_split(x1, ",")) %>%
unnest()
#> # A tibble: 7 x 2
#> x1 x2
#> <chr> <chr>
#> 1 a,b,c a
#> 2 a,b,c b
#> 3 a,b,c c
#> 4 d,e,f,g d
#> 5 d,e,f,g e
#> 6 d,e,f,g f
#> 7 d,e,f,g g
(3)使用多值摘要函数
#先认识一下quantile函数
quantile(mtcars$mpg)
#> 0% 25% 50% 75% 100%
#> 10.400 15.425 19.200 22.800 33.900
length(quantile(mtcars$mpg))
#> [1] 5
mtcars %>%
group_by(cyl) %>%
summarize(q = list(quantile(mpg)))
#> # A tibble: 3 x 2
#> cyl q
#> <dbl> <list>
#> 1 4 <dbl [5]>
#> 2 6 <dbl [5]>
#> 3 8 <dbl [5]>
(4)tibble::enframe() 命名列表
x <- list(
a = 1:5,
b = 3:4,
c = 5:6
)
df <- enframe(x)
df
#> # A tibble: 3 x 2
#> name value
#> <chr> <list>
#> 1 a <int [5]>
#> 2 b <int [2]>
#> 3 c <int [2]>
#对名称和值进行迭代
df %>%
mutate(
smry = map2_chr(
name,
value,
~ stringr::str_c(.x, ": ", .y[1])
)
)
#> # A tibble: 3 x 3
#> name value smry
#> <chr> <list> <chr>
#> 1 a <int [5]> a: 1
#> 2 b <int [2]> b: 3
#> 3 c <int [2]> c: 5
4.list转换为向量
获取list列的类型和长度信息
df <- tribble(
~x,
letters[1:5],
1:3,
runif(5)
)
df %>% mutate(
type = map_chr(x, typeof),
length = map_int(x, length)
)
#> # A tibble: 3 x 3
#> x type length
#> <list> <chr> <int>
#> 1 <chr [5]> character 5
#> 2 <int [3]> integer 3
#> 3 <dbl [5]> double 5
提取嵌套表格的一部分
df <- tribble(
~x,
list(a = 1, b = 2),
list(a = 2, c = 4)
)
df %>% mutate(
a = map_dbl(x, "a"),
b = map_dbl(x, "b", .null = NA_real_)
)
#> # A tibble: 2 x 3
#> x a b
#> <list> <dbl> <dbl>
#> 1 <list [2]> 1 2
#> 2 <list [2]> 2 NA
嵌套还原:如果有两个列表列,就需要它们同一行的元素数量相等。
df1 <- tribble(
~x, ~y, ~z,
1, c("a", "b"), 1:2,
2, "c", 3
)
#第一行都有两个元素,第二行都有一个元素
df1
#> # A tibble: 2 x 3
#> x y z
#> <dbl> <list> <list>
#> 1 1 <chr [2]> <int [2]>
#> 2 2 <chr [1]> <dbl [1]>
df1 %>% unnest(y, z)
#> # A tibble: 3 x 3
#> x y z
#> <dbl> <chr> <dbl>
#> 1 1 a 1
#> 2 1 b 2
#> 3 2 c 3
5.使用broom生成整洁数据
broom::glance(model) 摘要统计量,模型度量方式
broom::tidy(model) 系数的估计值或变异指标
broom::augment(model, data) 添加一些额外信息如残差。
sim1_mod <- lm(y ~ x, data = sim1)
coef(sim1_mod)
#> (Intercept) x
#> 4.220822 2.051533
broom::glance(sim1_mod)
#> # A tibble: 1 x 11
#> r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
#> * <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
#> 1 0.885 0.880 2.20 215. 1.17e-14 2 -65.2 136. 141.
#> # ... with 2 more variables: deviance <dbl>, df.residual <int>
broom::tidy(sim1_mod)
#> # A tibble: 2 x 5
#> term estimate std.error statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 (Intercept) 4.22 0.869 4.86 4.09e- 5
#> 2 x 2.05 0.140 14.7 1.17e-14
broom::augment(sim1_mod, sim1)
#> # A tibble: 30 x 9
#> x y .fitted .se.fit .resid .hat .sigma .cooksd .std.resid
#> * <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 4.20 6.27 0.748 -2.07 0.115 2.20 6.51e-2 -1.00
#> 2 1 7.51 6.27 0.748 1.24 0.115 2.23 2.32e-2 0.598
#> 3 1 2.13 6.27 0.748 -4.15 0.115 2.08 2.61e-1 -2.00
#> 4 2 8.99 8.32 0.634 0.665 0.0828 2.24 4.49e-3 0.315
#> 5 2 10.2 8.32 0.634 1.92 0.0828 2.21 3.74e-2 0.910
#> 6 2 11.3 8.32 0.634 2.97 0.0828 2.16 8.97e-2 1.41
#> 7 3 7.36 10.4 0.533 -3.02 0.0586 2.16 6.21e-2 -1.41
#> 8 3 10.5 10.4 0.533 0.130 0.0586 2.24 1.15e-4 0.0608
#> 9 3 10.5 10.4 0.533 0.136 0.0586 2.24 1.26e-4 0.0637
#> 10 4 12.4 12.4 0.454 0.00763 0.0424 2.24 2.78e-7 0.00354
#> # ... with 20 more rows
微信公众号生信星球同步更新我的文章
友情链接:
生信技能树公益视频合辑:学习顺序是linux,r,软件安装,geo,小技巧,ngs组学!
B站链接:https://m.bilibili.com/space/338686099
YouTube链接:https://m.youtube.com/channel/UC67sImqK7V8tSWHMG8azIVA/playlists
生信工程师入门最佳指南:https://mp.weixin.qq.com/s/vaX4ttaLIa19MefD86WfUA
学徒培养:https://mp.weixin.qq.com/s/3jw3_PgZXYd7FomxEMxFmw
资料大全:https://mp.weixin.qq.com/s/QcES9u1vYh-l6LMXPgJIlA
网友评论