美文网首页
day38 R语言 中级变量操作

day38 R语言 中级变量操作

作者: meraner | 来源:发表于2022-07-30 09:34 被阅读0次

    第四课 中级变量操作

    1. 保存数据时去掉行名操作
      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行

    1. 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) #每行平均值
    
    
    1. 自定义函数
      比如想得到每行最大值,可以直接用apply函数,也可以先定义一个rowMax函数,以后都可以调用之。
    > apply(mydata,1,max) #每行最大值
    > rowMax=function(x){apply(x,1,max)} #定义rowMax这个函数
    > rowMax(mydata) #也能求出每行最大值
    
    1. 对数据的每一行进行较为复杂的计算。
    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这三列,进行聚类热图

    相关文章

      网友评论

          本文标题:day38 R语言 中级变量操作

          本文链接:https://www.haomeiwen.com/subject/bwwbirtx.html