R学习 从Tidyverse学起,入门R语言(tidyr和stringr)
tidyverse出自于R大神Hadley Wickham之手,他是Rstudio首席科学家,也是ggplot2的作者。tidyverse就是他将自己所写的包整理成了一整套数据处理的方法,包括ggplot2,dplyr,tidyr,readr,purrr,tibble,stringr, forcats。同时也出了一本《R for Data Science》,这本书里面也详细介绍了tidyverse的使用方法。
R学习往期回顾:
R学习 从Tidyverse学起,入门R语言(tibble,readr和dplyr)
tidyverse包含日常处理数据使用的核心包
我们可以将这些包进行分类:数据导入、数据整理、数据转换、可视化、建模、编程。
上回我们学习了tibble,readr和dplyr
今天我们学习tidyr和stringr
参考:
https://zhuanlan.zhihu.com/p/22265154
https://www.jianshu.com/p/f58ccc1ea30b
#install.packages("tidyverse")
library(tidyverse)
tidyr
在tidyr包中,有四个常用的函数,分别是:
gather():宽数据转换为长数据,将行聚集成列
spread():长数据转换为宽数据,将列展开为行
unite():多列合并为一列
separate():将一列分离为多列.
我们平常所见的数据基本上是行为基因,列为样本,或是行为基因,列是样本
而在R中的清洁数据(Tidy data)原则是 每一列代表一次观测,每一行代表一个变量
而变量不仅有数字变量,还有分类变量
在我们上面的例子中,基因的ID,样品名称以及基因的表达量都是变量,而每一个基因在每一个样品中的表达量可以成为一次观测。因此,按照Tidy data的原则,应该将上述图表中的数据整理成如下格式:
这就是我们所谓的清洁数据
我们的目的是要把上边的数据转换成下边的格式。这里要引入键的概念,用于连接每对数据表的变量称为键。键是能唯一标识观测的变量(或变量集合) 要实现转换结果,在GeneId一定的情况下,我们可以把每一个样品和其对应的基因表达量看做一个键-值对(key-value pair)。比如:在GeneID为gene1时,sample1对应的表达量是3,sample2对应的表达量是4。因此,我们在转换数据时,只需按照上述规则,并指定要转换的列即可。使用tidyr包中的gather函数即可实现转换。
gather函数用法
gather函数宽数据转换为长数据,将行聚集成列,将列聚集到键值对中。
调用公式如下
> gather(data=,key=,value=,...,na.rm=,convert=,factor_key=)
# key:创建一个新的列名,原数据的旧列名成为新列名的观测值
# value:再创建一个新的列名,原数据的所有旧列名的观测值成为新列名的观测值
# ...:按照实际需要自行指定需要转换的列
# na.rm:逻辑值,是否删除缺失值
# convert:逻辑值,在key列是否进行数据类型转换
# factor_key:逻辑值,若是F,则key自动转换为字符串,反之则是因子(原始level水平保持不变)
构建一个表达矩阵
test <- tibble(
sample = c(1:10),
gene1 = rnorm(10, 0, 1),
gene2 = rnorm(10, 0, 2),
gene3 = rnorm(10, 0, 4)
)
宽数据转换为长数据
test %>%
gather("gene", "expression", -sample)
#或者
test %>%
gather( key ="gene",value = "expression",gene1,gene2,gene3)
spread函数用法
spread()函数将长数据转为宽数据,即将列展开为行,调用公式如下
> spread(data = ,key = ,value = ,fill = ,convert = ,drop = )
# key:指定转换的某列,其观测值作为转换后的列名
# value:其他列的观测值分散到相对应的各个单元
# fill:设定某个值,替换缺失值
test1<-test %>%
gather( key ="gene",value = "expression",gene1,gene2,gene3)
长转宽
test1%>%
spread(key ="gene",value = "expression")
unite函数用法
unite()函数是将数据框中多列合并为一列,调用公式如下:
> unite(data = ,col = ,... = ,sep = ,remove = )
# col:指定组合为新列的名字
# ...:指定数据中哪些列组合在一起
# sep:组合后新列中数据之间的分隔符
# remove:逻辑值,是否保留参与组合的列
构建数据
df <- expand_grid(x = c("a", NA), y = c("b", NA))
df
将x和y合并
df %>% unite("z", x:y, remove = FALSE)
用+合并
df %>% unite("z", x:y, sep='+',remove = FALSE)
去掉缺失值
df %>% unite("z", x:y, na.rm = TRUE, remove = FALSE)
separate函数用法
在学习了unite()函数后,separate()函数就很好理解了,它的作用正好和unite相反,即将数据框中的某列按照分隔符拆分为多列,一般用于时间序列的拆分,调用公式如下:
> separate(data = ,col = ,into = ,sep = ,remove = ,
+ convert = ,extra = ,fill = ,...)
# col:待拆分的某列
# into:定义拆分后新的列名
# sep:分隔符
# remove:逻辑值,是否删除拆分后的列
我们使用上面得到的数据集,对它进行拆分
df %>%
unite("xy", x:y)
df %>%
unite("xy", x:y) %>%
separate(xy, c("x", "y"))
df %>% unite("z", x:y, sep='+')
df %>% unite("z", x:y, sep='+')%>%
separate(z, c("x", "y"))
stringr
stringr,顾名思义,处理字符串专用包
str_c连接字符串
str_c("x", "y","z")
str_c("x", "y", sep =", ")
str_length计算字符串长度
x <- c("why", "video", "cross", "extra", "deal", "authority")
str_length(x)
#> [1] 3 5 5 5 4 9
str_sub取子集
str_sub(x, 1, 2)
#> [1] "wh" "vi" "cr" "ex" "de" "au"
str_sub(x, 1, 3)
#> [1] "why" "vid" "cro" "ext" "dea" "aut"
str_split函数进行拆分
fruits <- c(
"apples and oranges and pears and bananas",
"pineapples and mangos and guavas"
)
str_split(fruits, " and ")
默认返回的是列表
可以使用unlist()
unlist(str_split(fruits, " and "))
使用simplify = TRUE返回矩阵
str_split(fruits, " and ", simplify = TRUE)
使用 n= 可以限制拆分个数
str_split(fruits, " and ", n = 3)
str_split(fruits, " and ", n = 2)
使用str_split_fixed也可以返回矩阵
str_split_fixed(fruits, " and ", 3)
str_split_fixed(fruits, " and ", 4)
str_order(),str_sort()对字符向量排序
## 返回排序后的索引
> str_order(x, decreasing = FALSE, na_last = TRUE, locale = "", ...)
## 返回排序后的实际值
> str_sort(x, decreasing = FALSE, na_last = TRUE, locale = "", ....)
# decreasing:排序方式,默认为升序
# na_last:是否将缺失值置于末尾,默认为TRUE
str_order(letters)
str_sort(letters)
排序法则,默认是locale = "en"
str_order(letters, locale = "en")
str_sort(letters, locale = "en")
str_order(letters, locale = "haw")
str_sort(letters, locale = "haw")
str_replace字符串替换
str_replace(string, pattern, replacement)
str_replace_all(string, pattern, replacement)
#string:需要处理的字符向量
#pattern:指定匹配模
#replacement:指定新的字符串用于替换匹配的模式
#str_replace与str_replace_all的区别在于前者只替换一次匹配的对象,而后者可以替换所有匹配的对象
fruits <- c("one apple", "two pears", "three bananas")
str_replace(fruits, "[aeiou]", "-")
str_replace_all(fruits, "[aeiou]", "-")
str_replace_all(fruits, "[aeiou]", toupper)
str_replace_all(fruits, "b", NA_character_)
str_replace(fruits, "[aeiou]", c("1", "2", "3"))
str_replace(fruits, c("a", "e", "i"), "-")
还有其他一些函数的用法,详见下图