-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行???
幫助將不勝感激,謝謝。
@只是好奇爲什麼這個投票下來? 1)我已經顯示了一個有效的嘗試2)公佈了結果3)形成了一個有效的問題,爲什麼有更多的行返回比預期。是的,我沒有發佈數據,沒有規則需要發佈數據的Stackoverflow。 – cyber101