第1题.使用循环,对iris的1到4列分别画点图(plot)
自己思考加搜索后答案
以下显示是错误的,因为循环中生成的所有对象p1,p2,p3,p4,除了图标题外,均被赋予了最后一个图的值,这是因为aes用法不对,应该用列名而不是用实际的test[,i], 否则ggplot的对象里记载的数据是环境里的test[,i]列,最终显示的就是循环结束时的test。
应该使用aes_string,而不是aes,而 aes_string()中x,y的赋值需要加“”。
library(ggplot2)
library(patchwork)
test = iris
k=0
for (i in 1:4) {
p <- ggplot(data = test)+
geom_point(mapping = aes(x=c(1:150),y=test[,i],
color = Species))
k=k+1
assign(paste("p", k, sep = ""), p)} #利用assign函数(给1个名称赋值),先用paste函数生成名称,赋予p。assign(x,y) x为名称,y为赋值。
p1+p2+p3+p4
#待解决问题,patchwork拼100张图,怎么简化操作
正确答案
library(ggplot2)
library(patchwork)
index=1:150
test = iris
k=0
for (i in colnames(test)[1:4]) { #注意:i取的不是数值向量,而是test的列名
p <- ggplot(data = test)+
geom_point(mapping = aes_string(x=index,y=i,
color = "Species")) #aes_string函数列名需加引号
k=k+1
assign(paste("p", k, sep = ""), p)} #利用assign函数(给1个名称赋值),先用paste函数生成名称,赋予p。assign(x,y) x为名称,y为赋值。
p1+p2+p3+p4
另一种方法是把循环生成的图创建个列表直接输出成1个整图,需要R包Rmisc
library(ggplot2)
library(Rmisc)
index=1:150
test = iris
p_list <- list()
for (i in colnames(test)[1:4]) {
p <- ggplot(data = test)+
geom_point(mapping = aes_string(index,y=i,
color = "Species"))
p_list[[i]]=p}
p_list
Rmisc::multiplot(plotlist = p_list, layout = matrix(1:4, nrow = 2))
老师答案:竟然是如此简洁
par(mfrow = c(2,2))#
for(i in 1:4){
plot(iris[,i],col = iris[,5])
}
第2题:生成一个随机数(rnorm)组成的10行6列的矩阵,列名为sample1、sample2….sample6,
行名为gene1,gene2…gene10,分组为sample1、2、3属于A组,sample4、5、6属于B组。
用循环对每个基因画ggplot2箱线图,并尝试拼图。
x <- rnorm(60)
cyber <- matrix(x,nrow = 10,ncol = 6)
colnames(cyber) <- paste0("sample",1:6)
rownames(cyber) <- paste0("gene",1:10)
cyber<- t(cyber)
cyber<- as.data.frame(cyber)
cyber$group <- c("A","A","A","B","B","B")
library(ggplot2)
library(patchwork)
library(Rmisc)
p <- list()
for (i in colnames(cyber)[-ncol(cyber)]){
p <- c(p,
list(ggplot(cyber) +
geom_boxplot(aes_string(x ="group", y = i,col="group")) +
labs(title = paste(i))))
}
p
Rmisc::multiplot(plotlist = p, layout = matrix(1:10, nrow = 2))
老师的答案
exp = matrix(rnorm(60),nrow = 10)
colnames(exp) <- paste0("sample",1:6)
rownames(exp) <- paste0("gene",1:10)
exp[1:4,1:4]
#另一种方法矩阵合并向量! dat = cbind(t(exp),group = rep(c("A","B"),each = 3))
#以下为dplyr包中mutate函数新增列!
dat = data.frame(t(exp))
library(dplyr)
dat = mutate(dat,group = rep(c("A","B"),each = 3))
p = list()
library(ggplot2)
for(i in 1:(ncol(dat)-1)){
p[[i]] = ggplot(data = dat,aes_string(x = "group",y=colnames(dat)[i]))+
geom_boxplot(aes(color = group))+
geom_jitter(aes(color = group))+
theme_bw()
}#老师还增加了抖动点和主题
library(patchwork)
wrap_plots(p,nrow = 2,guides = "collect")
#patchwork也可以直接输出列表图像,更简洁,速度更快,perfect
# 分面也行的。
exp = matrix(rnorm(60),nrow = 10)
colnames(exp) <- paste0("sample",1:6)
rownames(exp) <- paste0("gene",1:10)
exp[1:4,1:4]
dat = data.frame(t(exp))
dat = mutate(dat,group = rep(c("A","B"),each = 3))
library(tidyr)#利用tidyr包的gather函数,将dat转换成以gene和group中元素对应的值为expression的3列数据框。
dat2 = gather(dat,key = "gene",value = "expression",-group)
ggplot(data = dat2)+
geom_boxplot(aes(x = group,y = expression,color = group))+
theme_bw()+
facet_wrap(~gene,nrow = 2) #以gene列为标准分面!!
第3题模拟出几个类似的文件,用R实现批量重命名
自己搜寻的答案
num<-1:5
for (i in num){
x<-paste('test',i,'.txt',sep = '')
file.create(x)
}
num<-1:5
for (i in num){
x<-paste('test',i,'.pdf',sep = '')
file.create(x)#生成文件函数可以生成txt,pdf,csv等各种后缀
}
old<- dir()
new <-paste("cyber",1:10,".txt")
new
file.rename(old,new)#重命名文件
old<- dir()
file.remove(old)# 删除文件
老师的答案
f = c("a .txt","b .txt","c .txt")
for(i in 1:3){
file.create(f[[i]])
}
#直接命名之后file.create,向量取子集[]用一个应该就可以
library(stringr)
f2 = str_remove(f," ")# stringr包的函数,去除连接方式,这里去除了f种abc与.txt之间的空格。
for(i in 1:3){
file.rename(f[[i]],f2[[i]])
}