tidy流处理数据的方便,我想这与管道符%>% 的使用,数据处理动词化,有着很重要的关系。
这是之前做数据清洗时,用到比较重要的一些技能和方法。
R for Data Science(笔记) ---数据变换(filter使用)
R for Data Science(笔记) ---数据变换(select基础使用)
R for Data Science(笔记) ---数据变换(select组合其他函数)
R for Data Science(笔记) ---数据变换(创建新的变量)
R for Data Science(笔记) ---数据变换(行排序)
R for Data Science(笔记) ---数据变换(归纳总结)
R for Data Science(笔记) ---数据整理(Pivot相关函数)
R for Data Science(笔记) ---数据整理(分列和合并)
上面这些技能基本是足够的了,但是这次主要是记录,根据其他行列的条件,创建新的变量的方法。使用到的函数是mutate
函数,配合case_when
函数进行。这种根据条件,创建新变量,也可以使用ifelse
函数完成,但是一旦条件多了,容易把自己绕晕。
使用场景
某个基因按照表达水平高低,分为了高低表达组,同时按照突变与否,变为突变组和非突变组。在上面两组分类的基础上,再创建一个组别,就是表达组和突变组的两两组合,也就是4种情况。
使用ifelse()
层层嵌套,不直观,使用case_when()
函数,就会显而易见。
数据特点
用R的示例数据,容易举一反三。
library(tidyverse)
data(starwars)
实战
starwars %>%
select(name:mass, gender, species) %>%
mutate(
type = case_when(
height > 200 | mass > 200 ~ "large",
species == "Droid" ~ "robot",
TRUE ~ "other"
)
)
结果如下
# A tibble: 87 × 6
name height mass gender species type
<chr> <int> <dbl> <chr> <chr> <chr>
1 Luke Skywalker 172 77 masculine Human other
2 C-3PO 167 75 masculine Droid robot
3 R2-D2 96 32 masculine Droid robot
4 Darth Vader 202 136 masculine Human large
5 Leia Organa 150 49 feminine Human other
6 Owen Lars 178 120 masculine Human other
7 Beru Whitesun lars 165 75 feminine Human other
8 R5-D4 97 32 masculine Droid robot
9 Biggs Darklighter 183 84 masculine Human other
10 Obi-Wan Kenobi 182 77 masculine Human other
# … with 77 more rows
这是根据几个指标,创建新的变量指标
深入
case_when
不是tidy类函数的内置函数,因此要使用类似tidy类似的语法,可以自己写一个函数,然后嵌入。
同样上面的例子
case_character_type <- function(height, mass, species) {
case_when(
height > 200 | mass > 200 ~ "large",
species == "Droid" ~ "robot",
TRUE ~ "other"
)
}
实验一下
case_character_type(150, 250, "Droid")
[1] "large"
case_character_type(150, 150, "Droid")
[1] "robot"
带入刚才的例子,简化代码,得到相同的结果
starwars %>%
mutate(type = case_character_type(height, mass, species))
网友评论