最近处理了一些数据 发现了写代码过程中值得注意的地方,特别是写循环的时候
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)
}