R语言杂谈(五)---处理数据框
## 如何了解一个数据框
## 看头
head(exprSet) ##前6行
head(exprSet)[,1:5] ##选取1-5列
## 看尾
tail(exprSet)
tail(exprSet)[,1:3]
## class看属性,dim看维度,str看结构
class(exprSet)
dim(exprSet) ##几行几列
str(exprSet) ##看每一列的结构,factor\num....
# 最直观的就是获取前10行,前10列进行观察判断
test <- exprSet[1:10,1:10]
##############################
# 获取第一行
test[1,]
# 获取第1列
test[,1]
## 使用$获取列
test$subgroup
# 选取第2到4行
test[2:4,]
# 选取第2到4列
test[,2:4]
# 选取第2到4行,3到5列
test[2:4,3:5]
##########################################################################
## 注意,我们可以通过位置获取,也可以通过行名和列名获取,还可以通过逻辑获取
##########################################################################
## 位置已经讲了
## 行名和列名呢?
## 其中行名获取的方法十分推荐,但是记住一点,行名不能重复
index <- rownames(test)
dd1 <- exprSet[index,]
dd2 <- exprSet[index,c("subgroup","sample","SAMD11")]
## 逻辑获取,先产生逻辑,再返回位置,再获取
test$subgroup == "Normal"
which(test$subgroup == "Normal") ##返回的是3和9
test[c(3,9),]
## 可以一步完成
test[test$subgroup == "Normal",]
## 在此基础上可以再选择列
test[test$subgroup == "Normal",c(1:5)]
## 难点在于产生正确的逻辑值
## 想一下,有多少种方法可以产生逻辑值??这个很重要
## 1.最重要的逻辑判断,如比较大小 2.函数产生,比如grepl,%in%
############################################################################
## 选行,选列,还有一个重要的函数subset
##subset,第一个数据,第二个选行(逻辑值),第三个是列,名称
test1 <- subset(test,test$subgroup == "Normal",select =c(1:5))
# 删掉第一列
test1 <- test[,-1]
# 增加一列
test1$subgroup <- test$subgroup ##增加的都位于最后面的位置
# 调整顺序,很常用
test1 <- test1[,c(10,1:9)] ##先选第10列后选1-9列
#获取名称
colnames(test)
rownames(test)
# 修改名称
colnames(test)[3:5] <- c("GeneA","GeneB","GeneC")
rownames(test)[1:2] <-c("sampleA","sampleB")
# 合并
## 加载数据
load(file = "bind.Rdata")
# 按列合并cbind
cbind2 <- cbind(cbindA,cbindB) ##将cbindB的列加在cbingA的后面,注意这里的id是一致的
cbind2 <- cbind2[,-5] ###将多余的第5列删掉
# 交叉合并 merge,这个很重要,很常用,是芯片数据探针ID转换的基础。
## merge的逻辑,很常用首先按照某个因素intersect,再rbind
cbindm <- merge(cbindA,cbindC,by="id") ##按id合并列,id取两者的交集然后合并
###如果我不会merge这个函数,那么可以按下面做
## 1,取交集,共有的名称
index <- intersect(cbindA$id,cbindC$id)
## 2.为了能用行名来获取,要产生行名
rownames(cbindA) <- cbindA$id
rownames(cbindC) <- cbindC$id
## 3.按照行名去获取两个子集,再用cbind按列合并
cbindme <- cbind(cbindA[index,],cbindC[index,c(2:4)]) ##第一列是id,我们前面有了就不要了,否则会造成重复
# 按行合并,rbind
rbind2 <- rbind(rbindA,rbindB)