我觉得 R 是一种很神奇的语言,用好了的话事半功倍,但其间要会有很多很多坑,希望大家多多注意不要泥足深陷。
- 时刻注意数据类型,很多报错是因为类型不符而产生的 chr or int ?factor 也是一个很难缠的数据类型(但省位子)
- 经常plot一下你的处理后数据,查看是否有异常。 很简单的一步,chr 变 numeric,需要as.numeric(as.character(x)) ,这样数据才不会出错。
==================读入文件================
dat <- as.data.frame(read.table("input.csv",header = TRUE,sep = ",", dec = ".",na.strings = "NA",stringsAsFactors=FALSE,check.names = FALSE))
row.names(dat) <- dat[,1]
dat<-dat[,-1]
dat[1:5,]
na.strings = "NA"控制缺失值
stringsAsFactors=FALSE,让每列的数据该是什么类型就是什么类型,全列数字的才自动成int 或dbl ,
check.names = FALSE,有行名如果是纯数字开头,会自动变成X开头,这个对后面的匹配很不友好,所以可以加这一句,避免变X。
==================写出文件================
#csv & txt
y_name=gsub("/", "&", y_name)
write.csv(d,file = paste('dat/',y_name,'.csv',sep=""),quote=F,row.names=F)
#png
png(file="metabolites_distribution_among_cancertype.png",width=2000,height=1000)
#content...
dev.off()
#pdf
pdf(file="metabolites_distribution_among_cancertype.pdf")
#content...
dev.off()
============ 删除NA行并匹配两表格 ============
#以下两种方法需要table1 和 table2 的行名是按顺序一一对应的
#先获取table1中NA的行号
dim(table1)
non_NA <- !is.na(table1[,1])
table1<-table1[non_NA,] #(去NA行方法1)
summary(non_NA)
#如果有另一个table2 与 table1 对应,需要同样去除NA的行
table2<-as.data.frame(table2[non_NA,])
dim(table2)
#同理,也可以先获取NA的行号,使用时直接调用
non_NA <- !is.na(table2[,1])
function(data.x=table1[non_NA,], data.y=table2[non_NA,]...)
#如果table1 和table2 的行名顺序是不一样的,需要用merge
#先获取去除table1d NA行(更新table1)
table1<-table1[complete.cases(table1),] #(去NA行方法2)
#table1<-na.omit(table1) #(去NA行方法3)
dat_rmNA<-merge(table1,table2,by="row.names",all.x=TRUE)
==================data.frame 格式改变 ===============
#一整个data.frame(需确认全是数字)的转换
dat_n=as.data.frame(lapply(dat[,-1],as.numeric))
#字符串型label转变为numeric类型
table(dat[,1])
a <- sub("F",2,data_pca[,1])
b <- sub("M",1,a)
dat[,1] <- a
dat[,1] <- b
dat<-as.data.frame(data_pca)
#一整个data.frame的factor变为numeric #is.factor也可以换成 is.character
dat_n[] <- lapply(dat, function(x) {
if(is.factor(x)) as.numeric(as.character(x)) else x
})
==================统计每行/列有多少个0================
dat=as.data.frame(dat)
#dat[1:5,]
f<-function(x) sum(x==0)
#按列统计是2,按行统计是1
d<-as.data.frame(apply(dat,2,f))
d
#如果数据中心还有NA,则整一个会显示为NA
============ jupyter notebook 中 python 结果显示多行==========
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
================初始化list或者array===========
#array
#dim=c(2,3,4),创建4个矩形矩阵,每个矩阵2行3列。
result <- array(NA,dim=c(dim(X)[2], 4, dim(Y)[2]))
rownames(result) <- colnames(X)
colnames(result) <- c("p","q","z","est")
#list
p_result <-rep(NA,length=dim(X)[2])
p_result[i] <- ...
#生成重复序列
rep(c("1","2","3"),times=c(5,42,34))
================移除/提取特定行和列============
#移除行列
dat<-dat[!rownames(dat) %in% c("12691.PC30","12691.PC10"),]
dat<-dat[,!colnames(dat) %in% c("specimen_id")]
#提取特定行列
dat<-dat[,c("specimen_id","disease_type_consol")]
dat<-dat[c("12691.PC30","12691.PC10"),]
#按条件提取行列
dat[dat[, "HvsC"] == "Cancer",]
#多个条件提取行/指定信息
subset(dat,host_age<=50&HvsC=="Cancer")
subset(dat,host_age<=50&HvsC=="Cancer",select=specimen_id)
在eset_f中,只提取dif表中有的行,并存储成selected 表