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包中,有四个常用的函数,分别是:
我们平常所见的数据基本上是行为基因,列为样本,或是行为基因,列是样本 而在R中的清洁数据(Tidy data)原则是 每一列代表一次观测,每一行代表一个变量 而变量不仅有数字变量,还有分类变量 在我们上面的例子中,基因的ID,样品名称以及基因的表达量都是变量,而每一个基因在每一个样品中的表达量可以成为一次观测。因此,按照Tidy data的原则,应该将上述图表中的数据整理成如下格式: 这就是我们所谓的清洁数据
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")) stringrstringr,顾名思义,处理字符串专用包 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"), "-") 还有其他一些函数的用法,详见下图 |
|