《实习日记》| 7月20日 R语言笔记——dplyr
7月20日
R语言笔记——dplyr
7月20日R语言笔记——dplyr五个基础函数1.mutate(),新增列2.select(),按列筛选两个实用技能1:管道操作 %>% (cmd/ctr + shift + M),传递作用2:count统计某列的unique值,管道操作CTRL + SHIFT + M3. merge()只可以取交集1.內连inner_join,取交集2.左连left_join,以在前面的数据集为准3.全连full_join4.半连接:返回能够与y表匹配的x表所有记录semi_join,返回所有与test2匹配的test15.反连接:返回无法与y表匹配的x表的所记录anti_join6.数据的简单合并练习6-11.将iris数据框的前4列gather,然后还原2.将第三列分成两列(以小数点为分隔符)然后合并3.加载test1.Rdata,将deg数据框按照pvalue从小到大排序4. 将两个数据框按照probe_id列连接在一起
rm(list = ls())
if(!require(dplyr))install.packages("dplyr")
library(dplyr)
test <- iris[c(1:2,51:52,101:102),]
rownames(test) =NULL
五个基础函数
1.mutate(),新增列
mutate(test, new = Sepal.Length * Sepal.Width)#此处不需要‘’和$
2.select(),按列筛选
(1)按列号筛选
select(test,1)
select(test,c(1,5))
select(test,Sepal.Length)
(2)按列名筛选
select(test, Petal.Length, Petal.Width)
vars <- c("Petal.Length", "Petal.Width")
select(test, one_of(vars))#将所有要提取列的列名设置为一个向量,但是要用one_of()
一组来自tidyselect的有用函数
select(test, starts_with("Petal"))
select(test, ends_with("Width"))
select(test, contains("etal"))
select(test, matches(".t."))#.指任意字符
select(test, everything())
select(test, last_col())
select(test, last_col(offset = 2))#距离最后一列距离为2的列
(4)利用everything(),列名可以重排序
test
select(test,Species,everything())#将调整为第一列
3.filter()筛选行
filter(test, Species == "setosa")
filter(test, Species == "setosa"&Sepal.Length > 5 )
filter(test, Species %in% c("setosa","versicolor"))
4.arrange(),按某一列对整个表格进行排序
arrange(test, Sepal.Length)#默认从小到大排序
arrange(test, desc(Sepal.Length))#用desc从大到小
arrange(test, Sepal.Length, desc(Sepal.Width))#根据两列排序,先排第一列Sepal.Length,再按照降序排Sepal.Width
5.summarise():汇总
对数据进行汇总操作,结合group_by使用实用性强
summarise(test, mean(Sepal.Length), sd(Sepal.Length))# 计算Sepal.Length的平均值和标准差:
先按照Species分组,计算每组Sepal.Length的平均值和标准差
group_by(test, Species)
summarise(group_by(test, Species),mean(Sepal.Length), sd(Sepal.Length))
两个实用技能
1:管道操作 %>% (cmd/ctr + shift + M),传递作用
library(dplyr)
a=iris
x1 = filter(iris,Sepal.Width>3)
x2 = select(x1,c("Sepal.Length","Sepal.Width" ))
x3 = arrange(x2,Sepal.Length)#按照Sepal.Length列,默认从小到大排序
rm(list = ls())
colnames(iris)
iris %>%
filter(Sepal.Width>3) %>%
select(c("Sepal.Length","Sepal.Width" ))%>%
arrange(Sepal.Length)
2:count统计某列的unique值,管道操作CTRL + SHIFT + M
count(test,Species)
count(test,test$Sepal.Length)
处理关系数据:即将2个表进行连接,注意:不要引入factor
3. merge()只可以取交集
rm(list = ls())
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,以在前面的数据集为准
test1
test2
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,返回所有与test2匹配的test1
semi_join(x = test1, y = test2, by = 'name')
semi_join(x = test2, y = test1, by = 'name')
test1
test2
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)
练习6-1
1.将iris数据框的前4列gather,然后还原
rm(list = ls())
options(stringsAsFactors = F)
library('tidyr')
head(iris)
data = iris[,1:4]
colnames(data)
gather_data =gather(data,key = var,value = exp)
data2 = spread(gather_data,key = var,value = exp)
data3=gather_data %>%
group_by(var) %>%
mutate(id=1:n()) %>%
spread(var,exp)
2.将第三列分成两列(以小数点为分隔符)然后合并
x=separate(iris,Sepal.Width,into = c('a','b'),sep = "[.]")
x#因为数值型的数据,所以划分之后会有0存在即NA,因此可以将NA替换
#x$b=replace_na(x$b,0);x
x_re=unite(x,"Sepal.Width",a,b,sep = ".")
x_re
str(x_re)
#看起来代码没什么不妥,但是仔细一看会发现其实有个坑,原始数据的第二行第二列是3.0,分割后0变成了NA,合并回来也是不对的。
#这个需求其实并不常见,只是为了作为一个例子,但这里还是说一下解决方案:
x=separate(iris,Sepal.Width,into = c('a','b'),sep = "[.]") %>%
tidyr::replace_na(list(b=0))
x
x_re=unite(x,"Sepal.Width",a,b,sep = ".")
x_re$Sepal.Width = as.numeric(x_re$Sepal.Width)#转换为数值型,NA变为0
x_re
str(x_re)
3.加载test1.Rdata,将deg数据框按照pvalue从小到大排序
rm(list = ls())
options(stringsAsFactors = F)
test1= load('test1.Rdata')
str(test1)
head(deg)
head(ids)
str(deg)
deg = arrange(deg,P.Value)
deg = arrange(deg,desc(P.Value))
4. 将两个数据框按照probe_id列连接在一起
p = inner_join(deg,ids,by="probe_id")