分享

R学习 从Tidyverse学起,入门R语言(tidyr和stringr)

 公号生信小课堂 2021-10-28

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)

R学习:字符串

R学习:环境和函数

R学习:数据框的基本操作

R学习:R for Data Science(五)

R学习:R for Data Science(四)

R学习:R for Data Science(三)

R学习:R for Data Science(二)

R学习:R for Data Science(一)

tidyverse包含日常处理数据使用的核心包

我们可以将这些包进行分类:数据导入、数据整理、数据转换、可视化、建模、编程。

上回我们学习了tibblereadrdplyr

今天我们学习tidyrstringr

参考:

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"), "-")

还有其他一些函数的用法,详见下图

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多