2016-08-02 15 views
-3

我把我的原始數據幀分成5249行(無特殊原因)的塊,爲了加速處理,試圖對整個500,000行進行計算時間過長。數據幀子集化獲取更多的數據,然後我應該

我創建了一個函數,以便根據匹配標準discoveredDf $ STUDYID_SUBJID == studyid_subjid來計算(Imputations for missing data),但是結果/返回的數據框比輸入數據框有更多的數據/行(肯定是我的bug)? ?

這裏是我的功能:

specialImpute <- function(inputDF) 
{ 

    discoveredDf <- data.frame(STUDYID_SUBJID=character(), stringsAsFactors=FALSE) 
    dfList <- list() 
    counter = 1; 

    Whilecounter = nrow(inputDF) 
    print(colnames(inputDF)) 
    #for testing just do 10 iterations,i = 10; 

    while (Whilecounter >0) 
    { 

    studyid_subjid=inputDF[Whilecounter,"STUDYID_SUBJID"] 

    vect = which(discoveredDf$STUDYID_SUBJID == studyid_subjid) 
    #was discovered and subset before 
    if (!is.null(vect)) 
    { 
     #not subset before 
     if (length(vect)<1) 
     { 
     # if the discovered df has STUDYID_SUBJID then do nothing . else subset & add to discovered Df 
     #vect =which(inputDF$STUDYID_SUBJID == studyid_subjid) 
     #df <- inputDF[vect, ] 
     print(paste("studyid_subjid:",studyid_subjid,sep="")) 
     df <- subset(inputDF, regexpr(studyid_subjid, inputDF$STUDYID_SUBJID) > 0) 

     #impute using mean for CONTINUOUS variables 

     df[is.na(df$COVAR_CONTINUOUS_2), "COVAR_CONTINUOUS_2"] = mean(df$COVAR_CONTINUOUS_2, na.rm=TRUE) 
     df[is.na(df$COVAR_CONTINUOUS_3), "COVAR_CONTINUOUS_3"] = mean(df$COVAR_CONTINUOUS_3, na.rm=TRUE) 
     df[is.na(df$COVAR_CONTINUOUS_4), "COVAR_CONTINUOUS_4"] = mean(df$COVAR_CONTINUOUS_4, na.rm=TRUE) 
     df[is.na(df$COVAR_CONTINUOUS_5), "COVAR_CONTINUOUS_5"] = mean(df$COVAR_CONTINUOUS_5, na.rm=TRUE) 
     df[is.na(df$COVAR_CONTINUOUS_6), "COVAR_CONTINUOUS_6"] = mean(df$COVAR_CONTINUOUS_6, na.rm=TRUE) 
     df[is.na(df$COVAR_CONTINUOUS_7), "COVAR_CONTINUOUS_7"] = mean(df$COVAR_CONTINUOUS_7, na.rm=TRUE) 
     df[is.na(df$COVAR_CONTINUOUS_10), "COVAR_CONTINUOUS_10"] = mean(df$COVAR_CONTINUOUS_10, na.rm=TRUE) 
     df[is.na(df$COVAR_CONTINUOUS_14), "COVAR_CONTINUOUS_14"] = mean(df$COVAR_CONTINUOUS_14, na.rm=TRUE) 
     df[is.na(df$COVAR_CONTINUOUS_30), "COVAR_CONTINUOUS_30"] = mean(df$COVAR_CONTINUOUS_30, na.rm=TRUE) 
     #impute using mode ordinal & nominal values 
     df[is.na(df$COVAR_ORDINAL_1), "COVAR_ORDINAL_1"] = mean(df$COVAR_ORDINAL_1, na.rm=TRUE) 
     df[is.na(df$COVAR_ORDINAL_2), "COVAR_ORDINAL_2"] = mean(df$COVAR_ORDINAL_2, na.rm=TRUE) 
     df[is.na(df$COVAR_ORDINAL_3), "COVAR_ORDINAL_3"] = mean(df$COVAR_ORDINAL_3, na.rm=TRUE) 
     df[is.na(df$COVAR_ORDINAL_4), "COVAR_ORDINAL_4"] = mean(df$COVAR_ORDINAL_4, na.rm=TRUE) 
     #impute using mode ordinal & nominal values 
     df[is.na(df$COVAR_NOMINAL_1), "COVAR_NOMINAL_1"] = mean(df$COVAR_NOMINAL_1, na.rm=TRUE) 
     df[is.na(df$COVAR_NOMINAL_2), "COVAR_NOMINAL_2"] = mean(df$COVAR_NOMINAL_2, na.rm=TRUE) 
     df[is.na(df$COVAR_NOMINAL_3), "COVAR_NOMINAL_3"] = mean(df$COVAR_NOMINAL_3, na.rm=TRUE) 
     df[is.na(df$COVAR_NOMINAL_4), "COVAR_NOMINAL_4"] = mean(df$COVAR_NOMINAL_4, na.rm=TRUE) 
     df[is.na(df$COVAR_NOMINAL_5), "COVAR_NOMINAL_5"] = mean(df$COVAR_NOMINAL_5, na.rm=TRUE) 
     df[is.na(df$COVAR_NOMINAL_6), "COVAR_NOMINAL_6"] = mean(df$COVAR_NOMINAL_6, na.rm=TRUE) 
     df[is.na(df$COVAR_NOMINAL_7), "COVAR_NOMINAL_7"] = mean(df$COVAR_NOMINAL_7, na.rm=TRUE) 
     df[is.na(df$COVAR_NOMINAL_8), "COVAR_NOMINAL_8"] = mean(df$COVAR_NOMINAL_8, na.rm=TRUE) 
     #logical (T ot F) was transformed T=1 & F=2 , to impute use Mode() 

     df[is.na(df$COVAR_y1_MISSING), "COVAR_y1_MISSING"] = mean(df$COVAR_y1_MISSING, na.rm=TRUE) 
     df[is.na(df$COVAR_y2_MISSING), "COVAR_y2_MISSING"] = mean(df$COVAR_y2_MISSING, na.rm=TRUE) 
     df[is.na(df$COVAR_y3_MISSING), "COVAR_y3_MISSING"] = mean(df$COVAR_y3_MISSING, na.rm=TRUE) 



     counter = counter +1; 
     if (counter %% 100 == 0) 
     { 
      print(counter) 
     } 
     } 
    } 


    Whilecounter = Whilecounter -1; 
    globalTrainingDf <- rbind(globalTrainingDf,df) 
    } 
    #end while 
    #union the data frame 

    return(globalTrainingDf) 

} 

Mode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

林返回:

nrow(training_df_columnn_subset_imputed) 
[1] 105892 

雖然它應該是5249行???

幫助將不勝感激,謝謝。

+0

@只是好奇爲什麼這個投票下來? 1)我已經顯示了一個有效的嘗試2)公佈了結果3)形成了一個有效的問題,爲什麼有更多的行返回比預期。是的,我沒有發佈數據,沒有規則需要發佈數據的Stackoverflow。 – cyber101

回答

1

問題在於你

subset(inputDF, regexpr(studyid_subjid, inputDF$STUDYID_SUBJID) > 0) 

聲明。 regexpr是貪婪的,它會匹配所有出現的模式,而不僅僅是完全匹配。在沒有看到您的數據的情況下,我懷疑有多場比賽只有預期完全匹配。如下例所示:

list<-c("example1", "example2", "example10") 
regexpr("example1", list)>0 
#[1] TRUE FALSE TRUE 

返回兩個TRUE,而不僅僅是預期的第一個TRUE。我建議改寫的說法,也許使用which聲明:

which("example1"== list) 

祝你好運!