• R随笔


    最近处理了一些数据  发现了写代码过程中值得注意的地方,特别是写循环的时候

    1,

    trait_data<-numeric()

    for(i in 0:(indi_num-1)){
    trait_eve<-traitdata[(3*i+1):(3*(i+1))]
    trait_data<-rbind(trait_data,trait_eve)
    }

    for(i in 0:(indi_num-1)){
    trait_eve<-matrix(traitdata[(3*i+1):(3*(i+1))],1,)   ### 变成一个矩阵就行并列
    trait_data<-rbind(trait_data,trait_eve)
    }

    这两个循环虽然得到的结果一样,但是前者更容易出错,而且出现这样的一个并列,行名就是一个变量名,这样在读入到你用R写的软件的时候,就只能读出第一行,其他行读不出来

    trait_eve 1 0 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 1 1 1 1 1

     trait_eve 1 5 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1 1 1 1 1 1

    而后者的循环的结果

    [1,] 1 0 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 1 1 1 1 1
    [2,] 1 5 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1 1 1 1 1 1

    这样的结果就不会出现上面的情况,是正确的结果

    2,

    trait_num<-3

    indi_num<-50

    trait_data<-numeric()

    trait_indidata<-numeri()

    for(i in 1:trait_num){
    for(j in 1:indi_num){
    trait_cc<-traitdata[(i+trait_num*j)]
    trait_indidata<-rbind(trait_indidata,trait_cc)##取一个性状数的所有数值

    }

    trait_data<-cbind(trait_data,trait_indidata)

    }

    这个循环结果是得到trait_data为 100,1的一个矩阵,并没有得到一个50,3的矩阵,因为在i=1的时候你对这个trait_indidata赋值第一列的数据trait_data[1],此时,在i=2的时候,你在之前的基础上又给第二列的数据加上去,trait_data<-cbind(trait_data[1],trait_indidata[1,2]),因此会报出行数不对的错误。

    trait_num<-3

    indi_num<-50

    trait_data<-numeric()

    for(i in 1:trait_num){
    trait_indidata<-numeri()
    for(j in 1:indi_num){
    trait_cc<-traitdata[(i+trait_num*j)]
    trait_indidata<-rbind(trait_indidata,trait_cc)##取一个性状数的所有数值

    }


    trait_data<-cbind(trait_data,trait_indidata)

    }

    这个才是 你想要的结果得到50,3的一个矩阵,在循环一次i后trait_indidata就会清0得到一列的矩阵,再把这样一列一列的矩阵并起来

    获取非NA的数据

    phe_y<-ncol(phe)

     phee<-as.matrix(phe[,i])##注意是取一列数据数据时,一定要把转换成矩阵的形式。如果你读取的数据只有一列,没有转换成矩阵的形式时,很容易出错,他就可能是数值型的                              

          ##数据,就容易出错
     phe00<-phe[is.na(phee)==F]###取非NA的数

     处理字符串的代码

    ###为了获得NAU后面,-前面的数据

    library(stringr)
    con<-as.matrix(read.csv("cotton.csv",header = FALSE))

    num<-con[,2]
    cont<-numeric()
    for(i in 1:dim(con)[1]){
    ##把单个字符串分开NAU004-230
    ##分成NAU004 230 num[1]<-NAU004-230

    str<-str_split(num[i],"-")
    ##把列表转换成向量
    mm<-unlist(str)

    ##提取第一个字符串中的数据,一定用用\d而不是d
    strs<-str_extract(mm[1],"\d+")
    strs<-matrix(as.numeric(strs),1,)
    cont<-rbind(cont,strs)
    }

  • 相关阅读:
    20151104内置对象
    20151102adonet2
    20151029adonet1
    20151028c#4
    20151027c#3
    20151026c#2
    20151021c#1
    20151020sql2
    20151019sql1
    Codeforces Round #261 (Div. 2) C. Pashmak and Buses(思维+构造)
  • 原文地址:https://www.cnblogs.com/yupeter007/p/5487595.html
Copyright © 2020-2023  润新知