tidyverse_代码在01.tidyr.R
R包和数据准备:
rm(list = ls())
options(stringsAsFactors = F)
if(!require(tidyr))install.packages("tidyr")
library(tidyr)
首先要数据清理,tidydata每个变量(variable)占一列,每个观测(observation)占一行。
tidyr 核心函数
一、数据清理
原始数据
test <- data.frame(geneid = paste0("gene",1:4),
sample1 = c(1,4,7,10),
sample2 = c(2,5,0.8,11),
sample3 = c(0.3,6,9,12))
test
扁变长
test_gather <- gather(data = test,
key = sample_nm,
value = exp,
- geneid)
head(test_gather)
长变扁
test_re <- spread(data = test_gather,
key = sample_nm,
value = exp)
head(test_re)
二、分割和合并
原始数据: test <- data.frame(x = c( "a,b", "a,d", "b,c"));test
1.分割
test_seprate <- separate(test,x, c("X", "Y"),sep = ",");test_seprate
2.合并
test_re <- unite(test_seprate,"x",X,Y,sep = ",")
三、处理NA
原始数据: X<-data.frame(X1 = LETTERS[1:5],X2 = 1:5)
X[2,2] <- NA
X[4,1] <- NA
image.png
1.去掉含有NA的行,可以只根据某一列来去除
drop_na(X)
image.png
drop_na(X,X1)
image.png
drop_na(X,X2)
image.png
X
image.png
fill(X,X2):用上一行的值填充NA
image.png
完整操作,查看小抄https://www.rstudio.com/resources/cheatsheets/
dplyr-五个基础函数 代码在02_dplyr.R
1.mutate()新增例
test = mutate(test, new = Sepal.Length * Sepal.Width) #要赋值,test才会变
image.png
2.select()按列筛选
3.filter()按行筛选
4.arrange(),按照数据框的某一列或者某几列给数据排序,功能强大
arrange(test, Sepal.Length)#表示按照test数据框的Sepal.Length这一列默认从小到大排序
arrange(test, desc(Sepal.Length))#desc表示从大到小排序
arrange(test, desc(Sepal.Width),Sepal.Length)#先按照desc(Sepal.Width)列排,如果desc(Sepal.Width)A列相同,按照Sepal.Length列排
5.summarise() 汇总
关系数据:即将2个表进行连接,注意:不要引入factor
options(stringsAsFactors = F)
test1 <- data.frame(name = c('jimmy','nicker','doodle'),
blood_type = c("A","B","O"))
test1
test2 <- data.frame(name = c('doodle','jimmy','nicker','tony'),
group = c("group1","group1","group2","group2"),
vision = c(4.2,4.3,4.9,4.5))
test2
test3 <- data.frame(NAME = c('doodle','jimmy','lucy','nicker'),
weight = c(140,145,110,138))
merge(test1,test2,by="name")
merge(test1,test3,by.x = "name",by.y = "NAME")
1.內连inner_join,取交集
inner_join(test1, test2, by = "name")
inner_join(test1,test3,by = c("name"="NAME"))
2.左连left_join
left_join(test1, test2, by = 'name')
left_join(test2, test1, by = 'name')
3.全连full_join
full_join(test1, test2, by = 'name')
4.半连接:返回能够与y表匹配的x表所有记录semi_join
semi_join(x = test1, y = test2, by = 'name')
5.反连接:返回无法与y表匹配的x表的所记录anti_join
anti_join(x = test2, y = test1, by = 'name')
6.数据的简单合并
在相当于base包里的cbind()函数和rbind()函数;
注意,bind_rows()函数需要两个表格列数相同,而bind_cols()函数则需要两个数据框有相同的行数。
test1 <- data.frame(x = c(1,2,3,4), y = c(10,20,30,40))
test1
test2 <- data.frame(x = c(5,6), y = c(50,60))
test2
test3 <- data.frame(z = c(100,200,300,400))
test3
bind_rows(test1, test2)
bind_cols(test1, test3)
两个实用技能
管道符号(重点)%>%(cmd/ctr + shift + M)
library(dplyr)
x1 = filter(iris,Sepal.Width>3) #一步一停
x2 = select(x1,c("Sepal.Length","Sepal.Width" )) #一步一停
x3 = arrange(x2,Sepal.Length) #一步一停
colnames(iris)
iris %>%
filter(Sepal.Width>3) %>%
select(c("Sepal.Length","Sepal.Width" ))%>%
arrange(Sepal.Length)#实现了前一步的输出变成后一步的输入;变成流水线作业
count:主语是数据框,统计数据框某列的重复值
count(test, Species) #其主语是数据框,返回结果是数据框
table(test$Species) # 也可以实现,其主语是向量,返回结果是向量
class(table()) #返回是table,正在淘汰的函数
image.png
stringr(重点)代码在03_stringr_characters.R
rm(list = ls())
if(!require(stringr))install.packages('stringr')
library(stringr)
x <- "The birch canoe slid on the smooth planks."
x
1.检测字符串长度
length(x)
str_length(x)
image.png
2.字符串拆分与组合
单个字符串拆分:
str_split(x," ")# 按照空格拆分
class(str_split(x," ")) #查看数据类型是列表
x2 = str_split(x," ")[[1]] #;列表取子集提取成向量
image.png
多个字符串拆分:
y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ") #得到长度为3的列表,每个元素是一个向量
str_split(y," ",simplify = T) #简化为矩阵
image.png
合并:
str_c(x2,collapse = " ") #把x2的不同元素按照空格连接在一起
str_c(x2,collapse = "::")
str_c(x2,1234,sep = "+") #一个向量和另一个一个元素的向量的连接;循环补齐
image.png
3.提取字符串的一部分
str_sub(x,5,9)
image.png
4.大小写转换
str_to_upper(x2)
str_to_lower(x2)
str_to_title(x2)
image.png
5.字符串定位
str_locate(x2,"th")
str_locate(x2,"h")
image.png
6.字符检测
str_detect(x2,"h") #非常重要的函数;生成一组与x2等长的逻辑支向量;检测是否含有某个值,有是TRUE,可以实现取子集,要学会,否则影响实战
str_starts(x2,"T")
str_ends(x2,"e")
image.png
与sum和mean连用,可以统计匹配的个数和比例
c(TRUE,1)
c(TRUE,F,1)
sum(str_detect(x2,"h")) #TRUE的个数
mean(str_detect(x2,"h"))#TRUE占全部的比例
image.png
7.提取匹配到的字符串
str_extract(x2,"th|Th") #只提取第一次出现的th或者TH
str_extract_all(x2,"o") #提取所有的o
str_extract_all(x2,"o",simplify = T) #简化提取出来的数据位矩阵
image.png
8.字符删除
str_remove(x," ") #移除第一次出现的空格
str_remove_all(x," ") #移除所有空格
str_remove_all(x2,"th") #移除所有出现的th
image.png
9.字符串替换
str_replace(x2,"o","A") #只替换第一次出现的o
str_replace_all(x2,"o","A") #替换所有出现的o
image.png
# 条件语句和循环语句
## if
if(逻辑值){就
}else{
}
ifelse(str_detect(x,"h"))
## for 循环(初学者最常用)
x通常是向量或者列表
i是指代x里的元素
列表简化为矩阵,do.call简化cbind
##while循环
while(一个变化的逻辑值eg:i<length(x)){
,,,
i = i +1
}
轻易不要用,进入死循环电脑会“自焚”
#apply函数(初学者入门的分水岭)
#lapply函数
列表
#sapply函数
直接返回向量