第 94 章 tidyverse中行方向的操作
dplyr 1.0 推出之后,数据框行方向的操作得到完美解决,因此本章的内容已经过时,大家可以跳出本章,直接阅读第39 章。(留着本章,主要是让自己时常回顾下之前的探索。让自己最难忘的,或许就是曾经的痛点吧)
tidyverse 喜欢数据框,因为一列就是一个向量,一列一列的处理起来很方便。然而我们有时候也要,完成行方向的操作,所以有必要介绍tidyverse中行方向的处理机制。
94.3 Row-wise Summaries
固然可解决问题, 然而,却不是一个很好的办法,比如除了求和与计算均值,可能还要计算每行的中位数、方差等等, 因为,不是每种计算都对应的row_函数? 既然是tidyverse ,还是用tidyverse 的方法解决
94.5 tidy 的方案
我个人推荐的方法(Gather, group, summarize, left_join)
new_df <- df %>%
mutate(id = row_number())
s <- new_df %>%
gather("time", "val", -id) %>%
group_by(id) %>%
summarize(
t_avg = mean(val),
t_sum = sum(val)
)
s
有点繁琐,但思路清晰
之所以有这么多的搞法,是因为没有一个很好的搞法
94.6 用slide方案
slide很强大,可以滚动喔
- 如果第一个参数是数据框,
slide
把数据框看作a vector of rows, 然后行方向的滚动,事实上, .x是一个个的小数据框(如下) - 与
purrr::map
不同,因为map把数据框看作列方向的向量, 然后迭代 - 如果第一个参数是原子型向量的话,还是依次迭代逗号分隔的元素,只不过这里是slide比map更强大的是,还可以是滚动
94.7 rowwise() + c_across()
df <- tibble(id = 1:6, w = 10:15, x = 20:25, y = 30:35, z = 40:45)
df
df %>%
rowwise(id) %>%
summarise(mean = mean(c(w, x, y, z)))
df %>%
rowwise(id) %>%
mutate(mean = mean(c(w, x, y, z)))
df %>%
rowwise(id) %>%
mutate(total = mean(c_across(w:z)))
df %>%
rowwise(id) %>%
mutate(mean = mean(c_across(is.numeric)))
# across()
df %>% mutate(mean = rowMeans(across(is.numeric & -id)))