苑黎

导航

 

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

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)
}

posted on 2016-05-12 22:12  苑黎  阅读(167)  评论(0编辑  收藏  举报