第四课 中级变量操作
- 保存数据时去掉行名操作
write.csv(b,file='test2.csv',row.names = F)
# 保存的test2.csv文件就没有行名了。
2.按照某一列排序(类似excel里面排序)
sort(b$xxx,decreasing=T)[1]
#意思是取xxx这一列里面从大到小排列后,的第一个数,就是这一列最大值。
也可以用下面的函数显示最大,最小值。
max(b$xxx)
min(b$xxx)
fivenum(b$xxx)
可以拿到百分之0,25,50,75,100,这五个数,默认都是从小到大。
3.table函数进行计数或统计频次
table(b$xxx<5000)
#可统计xxx这一列中小于5000的有几个,不小于5000的有几个。
4.建立新的数据
比如b这个数据中,要把OCF_LTot这一列里大于5的这些单独分出来:
> table(b$OCF_LTot>10)
FALSE TRUE
20123 13
> c=b[b$OCF_LTot>10,] #c这个数据就有13行,都是OCF_LTot>10
>boxplot(b$OCF_LTot~b$strand) #把OCF_LTot这一列数据画箱图,分组是按照strand这一列分。
image.png
再比如想取chr这一列中chr1的数据出来,可以这么操作
> table(b$chr=='chr1')
FALSE TRUE
18070 2066
> ch1=b[b$chr=='chr1',] #建立一个新的变量ch1,行满足是chr为chr1,列没有要求
5.行平均值
方法一:mean
Mean(as.numeric(a[1,]))
Mean(as.numeric(a[2,]))
...
方法二:rowMeans函数
head(rowMeans(a))
#把数据a求其行平均值(a必须为数值型) , 显示前10行
- R里的循环一
for (i in 1 : nrow(b) {
print(Mean(as.numeric(a[i,])))
}
就会把a中每一行的平均值输出。
7.R里的循环二
apply(b,1,function(x){
mean(x)
})
取b中的数据,1表示按照行来取,function(x)是把从b中取出来的行打包成x,后面进行平均值计算。
下面练习,是先生成30个符合正态分布的数据,然后拍成6行的矩阵。之后用apply的两种方法求每行的平均值。还可以直接用rowMeans函数来求每行平均值。
> mydata<-matrix(rnorm(30),nrow=6)
> apply(mydata,1,mean) #每行平均值
> apply(mydata,1,function(x){mean(x)}) #每行平均值
> rowMeans(mydata) #每行平均值
- 自定义函数
比如想得到每行最大值,可以直接用apply函数,也可以先定义一个rowMax函数,以后都可以调用之。
> apply(mydata,1,max) #每行最大值
> rowMax=function(x){apply(x,1,max)} #定义rowMax这个函数
> rowMax(mydata) #也能求出每行最大值
- 对数据的每一行进行较为复杂的计算。
for(i in 1:nrow(mydata)){
x=as.numeric(mydata[i,])
y=x[1]+x[2]-x[3]*x[4]
print(y)
}
先把每一行里的数据提出为x这个向量。然后取x向量里的对应数据,把计算公式标注清楚。
然后再进一步设计个新的函数,以后就可以调用这个函数计算啦。效果和上面一样。
mystat<-function(mydata){
for(i in 1:nrow(mydata)){
x=as.numeric(mydata[i,])
y=x[1]+x[2]-x[3]*x[4]
print(y)
}
}
mystat(mydata)
10.计算后排序,取前50个
> mydata<-matrix(rnorm(500),ncol=5) #先产生一个矩阵出来,100行的
> sort(apply(mydata,1,sd),decreasing = T)[1:50] #把每一行的sd值算出来,降序排列,取前50个
11.数值数据行名要进行指定才有。
之前建立的mydata数据并不是数据框,所以在输入rowname(mydata)
的时候显示NULL
>rowname(mydata)
NULL
>str(mydata)
num [1:100, 1:5] 0.76346 0.85663 0.00185 0.34001 1.55251 ...#这时mydata只是一个数据型向量
>is.data.frame(mydata)
FALSE
>mydata=as.data.frame(mydata) #转变成数据框
>rowname(mydata) 这时候就自动有行名了
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13"
[14] "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26"
[27] "27" "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39"
[40] "40" "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" "51" "52"
[53] "53" "54" "55" "56" "57" "58" "59" "60" "61" "62" "63" "64" "65"
[66] "66" "67" "68" "69" "70" "71" "72" "73" "74" "75" "76" "77" "78"
[79] "79" "80" "81" "82" "83" "84" "85" "86" "87" "88" "89" "90" "91"
[92] "92" "93" "94" "95" "96" "97" "98" "99" "100"
>rownames(mydata)=mydata[,3] # 可以取第三列作为行名,但行名必须是唯一的
> rownames(mydata)=1:100 #也可以直接就用数字表示
12.做热图
安装包pheatmap,再对mydata这个数据做热图
install.packages("pheatmap")
pheatmap::pheatmap(mydata[1:50,])
pheatmap::pheatmap(mydata[1:10,1:3]) #取1-10这十行,1-3这三列,进行聚类热图
网友评论