0

Rpy2を使用してr-scriptを実行し、スクリプトに分析結果をcsvファイルに書き込む機能がある場合、出力ファイルにレコードが欠落するという問題がありました。ソースコードは以下をご覧ください。

たとえば、ソース ファイル (f2) に 785 レコードがあり、分析後、出力ファイル (処理済み) には 785 ファイルがあるはずです。ただし、出力ファイルのレコードが少なくなります。rスクリプトをRで直接実行しても、そのような問題はありません。コールドが間違っていることを知っている人はいますか? ありがとう。

def make_standardization(filename,outdata):
traindata = os.path.join(settings.MEDIA_ROOT, "default_predict_train.csv") 
testdata = os.path.join(settings.MEDIA_ROOT, filename) 


robjects.r.assign("f1",traindata)
robjects.r.assign("f2",testdata)
robjects.r.assign("processed", outdata)

robjects.r("""
    train.dta=read.csv(f1,header=T)
    test.dta=read.csv(f2,header=T)

    train.h=train.dta[,c(1:2)]
    train.x=train.dta[,-c(1:2)]
    train.colnames=sub("PFGE.XbaI.","",colnames(train.x))
    train.colnames=as.numeric(train.colnames)

    test.h=test.dta[,c(1:2)]
    test.x=test.dta[,-c(1:2)]
    test.x=t(t(test.x))
    temp=matrix(as.numeric(test.x),nrow=nrow(test.x),ncol=ncol(test.x))
    colnames(temp)=colnames(test.x)
    test.x=temp
    test.x[is.na(test.x)]=0.5
    test.colnames=sub("PFGE.XbaI.","",colnames(test.x))
    test.colnames=as.numeric(test.colnames)


    temp=matrix(0,nrow=nrow(test.x),ncol=ncol(train.x))
    colnames(temp)=colnames(train.x)
    rownames(temp)=rownames(test.x)

    for(i in 1:ncol(train.x)){

        if(i == 1) {
            index=which( test.colnames > (train.colnames[i]+train.colnames[i+1])/2    )
            if(length(index)==1){
                temp[,i]=test.x[,index]
            }else{
                temp[,i]=1*(rowSums(test.x[,index])>0)
            }
        }

        if(i == ncol(train.x)) {
            index=which( test.colnames <= (train.colnames[i]+train.colnames[i-1])/2    )
            if(length(index)==1){
                temp[,i]=test.x[,index]
            }else{
                temp[,i]=1*(rowSums(test.x[,index])>0)
            }
        }        

        if(i >1 && i< ncol(train.x)){
            index=which( test.colnames > (train.colnames[i]+train.colnames[i+1])/2  & test.colnames <= (train.colnames[i]+train.colnames[i-1])/2    )
            if(length(index)==1){
                temp[,i]=test.x[,index]
            }else{
                temp[,i]=1*(rowSums(test.x[,index])>0)
            }            
        }            

    }

    test.x=cbind(test.h,temp)

    write.csv(test.x,processed)

""")
4

0 に答える 0