标签:
最近处理了一些数据 发现了写代码过程中值得注意的地方,特别是写循环的时候
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得到一列的矩阵,再把这样一列一列的矩阵并起来
标签:
原文地址:http://www.cnblogs.com/yupeter007/p/5487595.html