R基础学习 | 处理数据的技巧整理

这里总结一下,今天老师上课的内容。我觉得跟着老师,我能学到好多东西。我要消化。我突然觉得自己很卑微,因为有那么多东西需要学习的。但是
复习的侧重点在:什么是自己知道的?什么是自己不知道的?缺什么补什么?


R基础知识整理(查漏补缺)

S1:identical
identical(a,i) #既检验数值又检验数据类型
i==m

在这里插入图片描述在这里插入图片描述

== 仅仅是数值的比较;
identical 则同时包括数值和属性的比较;

S2: stringasFactor=FALSE
df3 <- data.frame(a=1:10, b="character")
df3 <- data.frame(a=1:10, b="character", stringsAsFactors=FALSE)

stringasFactor等于TRUE或FALSE有何意义?
就是在行列操作的时候,不要把string转换为factor。
(如果发生错误,这个可以作为检查的内容)

S3:对于矩阵(或data.frame)的操作:如何拿到某一行或者某一列的数?

方法1:根据行列号

meta.data[4,1]
[1] "Stage: 6"

*对于data.frame,还可以通过$符号引用每一列。

meta.data$V2
[1] "GSM703914" "A1C"       "21PCW"     "Stage: 6" 

#还有,不能直接对data.frame进行转换,需要选择是那一列进行vector转换,尤其是仅有一列的情况要特别注意,否则会报错。

方法2:根据行列名**【这个是我之前不知道的】

meta.data["Stage","V2"]
[1] "Stage: 6"

注意:(1)如果拿到的是某一行的话,仍旧是一个矩阵。后期分析,要做数据类型转换。(2)如果拿到的是某一列的话,就变成了vector。
(老师提到的这一点是我分析的时候注意到,但是没有细心的去总结的点。)

#对行操作
dim(meta.data[4,]) #变成了1*n列的矩阵
[1]    1 1340
#如果只有一行一列,也会相应的转换成一个vector的

#对列操作
dim(meta.data[,2]) #没有维数了
NULL
meta.data[,2] #变成了vector
[1] "GSM703915" "AMY"       "21PCW"     "Stage: 6" 

注意: data.frame和matrix的区别主要在于:
(1)data.frame可以存储不同的数据类型。
(2)matrix则要求存储的数据类型一致,如果不一致也会强行转为一致。

S4:list数据类型

#两种不同的赋值list的区别:

> l1<-list(1:10)
> l2<-as.list(1:10)
> l1
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

> l2
[[1]]
[1] 1

[[2]]
[1] 2

#提取元素:

l2[[10]] #根据序号
[1] 10

l2[["10"]] #根据名字
[1] 10

l2$`10` #使用`$`符号
[1] 10

在循环的时候,可以使用apply、lappy,sapply函数代替循环,提高运算速率。


R语言高级应用(这个有很多有待补充的地方)

(1)sweep()函数:高效处理行列运算的函数
sweep(count,2,colSums(data),"\")
#解释:对于这个数据的每一列,除以colSums的每一个值。
#这个似乎就是之前我想做的事情

上下两个代码等效。

方法1:用传统for循环,需要定义若干中间变量。

sq_line=function(x){sum(x^2)}
cellType_sq<-as.data.frame(apply(cellTypeMean2,1,sq_line))
m<-dim(cellTypeMean2)[1]
n<-dim(cellTypeMean2)[2]
b<-as.data.frame(matrix(,ncol=14,nrow=0))

for(i in 1:m){
  a<-c()
  for (j in 1:n) {
    SPM_Score<-(cellTypeMean2[i,j])^2/cellType_sq[i,1]
    a<-append(a, SPM_Score)
  }
  b<-rbind(b,a)
}
colnames(b)<-colnames(cellTypeMean2)
cellTypeSPM<-b

方法2:直接使用apply和sweep,几行代码搞定。

sq_line=function(x){sum(x^2)}
cellType_sq<-as.data.frame(apply(cellTypeMean2,1,sq_line))
cellType_sq2<-as.numeric(cellType_sq$`apply(cellTypeMean2, 1, sq_line)`)
sq_2=function(x){x^2}
cellTypeMean2_2<-t(apply(cellTypeMean,1,sq_2))
cellTypeSPM2<-sweep(cellTypeMean2_2,1,cellType_sq2,"/")

我学到了!

(2)构建用于绘图的factor
SpeciesCols <- c("red", "green") #定义character
names(SpeciesCols) <- c("Human", "Macaque")
SpeciesColors <- SpeciesCols[plotDat$Species] #这样代码高度值得学习 #用species来定义物种对应的颜色
plot(log2(plotDat$Days), plotDat$SOX11, xlab="Log2(days)", ylab="SOX11", col=SpeciesColors)
(3)match():可以替代传统的subset,直接提取两个数据之间匹配的行
phe[match(bpDat$Sample, phe$Sample),2:15] #提取相同的行
(4)melt():在画boxplot的时候,可以取代unstack和stack函数,快捷整理数据的函数
bpDat <- melt(rpkm[,1:20])
(5)用R做PCA:对于PCA得到的值得理解
# PCA #
########
pca <- prcomp(t(rpkm), center=TRUE, scale=TRUE) #使用prcomp函数直接做PCA
pcaPlotDat <- cbind(phe, pca$x[,1:2])
ggplot(pcaPlotDat) + geom_point(aes(x=PC1, y=PC2, shape=Species, color=factor(Predicted.period)), size=3)

# Note: what does loading mean?
pca$rotation[order(pca$rotation[,"PC1"]),1:2][1:30,]#提取第一主成分
pca$rotation[order(pca$rotation[,"PC1"], decreasing=TRUE),1:2][1:30,]#提取第一主成分最接近第一主成分的特征基因

pca$rotation[order(pca$rotation[,"PC2"]),1:2][1:30,]
pca$rotation[order(pca$rotation[,"PC2"], decreasing=TRUE),1:2][1:30,]

对比一下,我之前从网上不动脑筋copy的代码,错误在哪里?

#想用一下在课上学到的方法#使用PCA,看看样本整体的特征
com1 <- prcomp(subdata, center = TRUE,scale. = TRUE)
test<-as.data.frame(com1$rotation) #我这边错误主要是这里 #我不知道pca计算的各个值是什么意思,把rotation作为要计算的量进行计算了#应该是com1$x的这个矩阵
dim(test)
head(test)[1:4,1:4]
#到这里PCA的过程是完成了
#xlab<-paste0("PC1(",round(Proportion_of_Variance[1]*100,2),"%)")
#ylab<-paste0("PC2(",round(Proportion_of_Variance[2]*100,2),"%)")
#绘制散点图
class.label<-as.character(sub.meta.data[2,])
test<-cbind(test,class.label)
#这个color的着色策略不知道
library(ggplot2)
p1<-ggplot(data = test,aes(x=PC1,y=PC2,color=class.label))+
  geom_point() #好像也没出啥大问题,最好是吧aes这些不放在主图的放在geom_point()这个函数这边
p1

学到的知识点(主要是对pca计算得到的两个矩阵的理解):
(1)x是计算得到的pca的值的数据矩阵
(2)rotation是一个坐标值,每一个基因距离我们pca抽象得到的这个坐标的距离。距离越小,代表向某一主成分变换的就小,代码其表达值则很有可能作为特征基因分离这些class。

注意在做pca的时候,有一个细节,因为我们想要对样本进行分类,所以需要对数据矩阵进行转置。

#未转置,错误作法
#这里的行,为基因的ID,这就不对,我们想要对样本进行分类
com1 <- prcomp(data, center = TRUE,scale. = TRUE)
com1$x[1:5,1:2]
              PC1       PC2
2315554  4.459692  1.474634
2315633 -5.760801 -5.753679
2315674 13.270301  2.059976
2315739  2.277192  2.812428
2315894 14.307125 -2.800463

#正确做法,需要转置
com2 <- prcomp(t(data), center = TRUE,scale. = TRUE)
com2$x[1:5,1:5]
                PC1        PC2       PC3       PC4         PC5
GSM703914 -41.74332 -28.254455  31.02642 -13.97364   0.0528662
GSM703915 -78.62093  43.049833  23.68928 -27.47652 -19.7426515
GSM703916 -52.34926  -8.689505 -25.94499 -36.08583  14.3021587
GSM703917 -46.36151 -28.822441  55.42635  23.48154   6.7447402
GSM703918 -57.02875  37.377344  15.93358 -19.52037 -15.1469523
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值