vlambda博客
学习文章列表

《实习日记》| 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")