# Program for changing frequencies to allele lengths #define the number of individuals forming the BULK, ni ********************************** ni=15 #number of alleles (ni*2) nal=ni*2 # Read data and create a list # it is convenient to use ".CSV" input files , specially when there are missing values a10=read.csv(file="exFtoL.csv", header=TRUE) #Next line read an ASCII format file #a10=read.table(file="ftol-example.txt", header=TRUE,sep='') a20=split(a10, a10$marker) #F to L function ftol=function(inputfile) { a1=a0[,3:ncol(a0)] a2=cbind(a0[,1],a0[,2],trunc(0.5+(a1*nal))) suma=apply(a2[,3:ncol(a2)],2,sum) suma test=suma-nal colmiss=test[is.na(test)] test[is.na(test)]=0 #correcting round errors (+1, +2 or -1, -2) for(i in 1:length(test)) { x=a1[,i];x[x==0]=NA if(test[i]==-2) {id= which.max(x) ; a2[id,(i+2)]=a2[id,(i+2)]+1 x[id]=NA id1=which.max(x); a2[id1,(i+2)]=a2[id1,(i+2)]+1 } if(test[i]==-1) {id=which.max(x); a2[id,(i+2)]=a2[id,(i+2)]+1} if(test[i]==1) {id=which.max(a1[,i]); a2[id,(i+2)]=a2[id,(i+2)]-1} if(test[i]==2) {id=which.max(a1[,i]); a2[id,(i+2)]=a2[id,(i+2)]-1 x[id]=NA id1=which.max(x); a2[id1,(i+2)]=a2[id1,(i+2)]-1 } } suma=apply(a2[,3:ncol(a2)],2,sum) a2[is.na(a2)]=0 a3=matrix(nrow=nal,ncol=ncol(a2)-2); for(l in 3:ncol(a2)) {m=0 for(j in 1:nrow(a2)) for(k in 1:a2[j,l]){ if(a2[j,l]!=0){m=m+1; if(m<=nal) a3[m,(l-2)]=a2[j,2]} } } # creating 15 genotypes from "nal" alleles a4=matrix(nrow=ni*ncol(a3),ncol=3) nam4=matrix(nrow=ni*ncol(a3),ncol=1) nam1a=colnames(a1) for(i in 1:ncol(a3)) { x0=a3[,i] x1=sample(x0, nal, replace = FALSE, prob = NULL); x2=matrix(0,ni,3) for(j in 1:ni) { x2[j,1]=j x2[j,2]=x1[2*(j-1)+1]; x2[j,3]=x1[2*(j-1)+2] } a4[(ni*(i-1)+1):(ni*i),]=x2 nam4[(ni*(i-1)+1):(ni*i),]=rep(nam1a[i],ni) } a5=cbind(nam4,as.data.frame(a4)) colnames(a5)=c("geno", "ind", paste(a0[1,1],c("-1","-2"),sep="")) a5 } # end FtoL function sale=list();final0=data.frame(aux=0) # applying the function FtoL using a20[[i]] as input file, and sale[[i]] as output file for(i in 1:length(a20)) { a0=a20[[i]] sale[[i]]=ftol(inputfile=a0) final0=merge(final0,sale[[i]]) } final0$ind=as.numeric(final0$ind) temp=final0[order(final0$geno, final0$ind),] final=temp[,c(1,2,4:ncol(temp))] nombres=t(names(a20)) # you can use any of the next lines for obtaining CSV or ASCII format output files write.csv(final, file="exFtoL-OUT.csv", quote=F, row.names=F, na="") #help(write.csv) #write.csv(nombres, file="nombres.csv", quote=F) #write.table(final, file="final2.txt", quote=F,row.names=F) write.table(nombres, file="names.txt", quote=F,row.names=F,col.names=F) # Estimate frequencies on the simulated individuals lim= (ncol(final)-1);lim2= (ncol(final)-2)/2 ;k=0; ff=list(length=lim2);pfin=list(length=lim2) for(i in seq(from=3, to=lim, by=2)) { k=k+1 ff[[k]]=table(c(final[,i],final[,i+1])) pfin[[k]]=ff[[k]]/sum(ff[[k]]) } names(pfin)=nombres pfin