rm(list = ls())
掌握for循环,if判断, apply批量操作
for循环
写法一:for (variable in vector) {
action(variable)
}
写法二:for (variable in vector) { action(variable)}
写法三:for (variable in vector) action(variable)
if 判断
第一种
if (condition) {
action
}
第二种
if (condition) {
action
} else {
action
}
##################################################
if 判断实战:利用循环判断癌和癌旁组织
加载数据
load(file = "data/TCGA_ggplot.Rdata")
首先确定框架,我们的需求是批量做什么?
然后解决单次操作:如何用R语言实现单次的需求
方法一:for循环+if判断
实战代码步骤分解:
创建容器
metadata <- data.frame(TCGA_id=rownames(exprSet))
for (i in 1:nrow(metadata)) {
指示
print(i)
substring的用法,这是元素获取
num <- as.numeric(substring(metadata[i,1],14,15))
#如果是肿瘤,就给第2列加上Tumor if (num %in% seq(1,9)) { metadata[i,2] = "Tumor" }
#如果是正常组织,就给第2列加上Normal if (num %in% seq(10,29)) { metadata[i,2] = "Normal" } }
修改名称
colnames(metadata) <- c("TCGA_id","sample")
统计频次
table(metadata$sample)
方法二: ifelse 二分类
TCGA_id <- rownames(exprSet)
使用table来统计频次
substring(TCGA_id,14,15)
table(substring(TCGA_id,14,15))
sample <- ifelse(substring(TCGA_id,14,15)=="11","Normal","Tumor")
将结果与ID整理为新的数据表
metadata <- data.frame(TCGA_id,sample)
table(metadata$sample)
rm(list = ls())
方法三:三分类
好几种方法:
(1)
TCGA_ id <- rownames (exprSet)
index <- substring (TCGA_id, 14,15)
table(index)
sample <- factor(index,
levels = c("01", "06", "11"),
labels = c("Primary", "Metastatis", "Normal")
)
metadata <- data.frame(TCGA_id,sample)
table(sample)
(2)
(3)
(4)
apply()
apply 处理的是矩阵或者纯数据的数据框的行或者列
apply(X, MARGIN, FUN, …)
其中X为一个数组;MARGIN为一个向量(表示要将函数FUN应用到X的行还是列),
若为1表示取行,为2表示取列,为c(1,2)表示行、列都计算。
load(file = "data/brca.Rdata")
ma <- exprSet[,5:9]
按行操作
apply(ma,1, sum)
rowSums(ma)
按列操作
apply(ma,2, mean)
colMeans(ma)
apply实战中的作用
rm(list = ls())
1.去掉表达值一致的基因
load(file = "data/apply_var.Rdata")
test <- rt[,1:10]
dd <- rt[,-c(1,2)]
sum(apply(dd,2,var)==0)
dd1 <- dd[,apply(dd,2,var)!=0]
rt <- cbind(rt[,c(1,2)],dd1)
2.批量转换
批量把因子转换成数值,还记得这里的坑么?
rm(list = ls())
load(file = "data/expreSet_string.Rdata")
注意,学会str的用法
str(expreSet)
可以看出expreSet是数据框,但是里边的内容都是文本,如"2.71059"
test <- expreSet[,2]
head(test)
as.numeric(test)
as.numeric(as.character(test))
两次批量操作
dd1 <- apply(expreSet,2,as.character)
dd2 <- apply(dd1,2,as.numeric)
dd3 <- as.data.frame(dd2)
注意,学会str的用法
str(dd3)
#######################################################
复习:
for 循环结构,
if 判断结构
table
ifelse
var
apply
as.character()
as.numeric()
as.data.frame()
str