R 数据帧子集获得更多的数据,然后我应该

R 数据帧子集获得更多的数据,然后我应该,r,dataframe,R,Dataframe,我将原始数据帧切成5249行(没有特殊原因),为了加快处理速度,试图对整个500000多行进行计算花费的时间太长 我创建了一个函数,以便根据发现的匹配条件计算(缺失数据的插补)$STUDYID_subcid==STUDYID_subcid,但是结果/返回的数据帧比输入数据帧有更多的数据/行(肯定是我的错误) 以下是我的功能: specialImpute <- function(inputDF) { discoveredDf <- data.frame(STUDYID_SUBJ

我将原始数据帧切成5249行(没有特殊原因),为了加快处理速度,试图对整个500000多行进行计算花费的时间太长

我创建了一个函数,以便根据发现的匹配条件计算(缺失数据的插补)$STUDYID_subcid==STUDYID_subcid,但是结果/返回的数据帧比输入数据帧有更多的数据/行(肯定是我的错误)

以下是我的功能:

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)))]
}
而它应该是5249行


谢谢你的帮助

问题在于你的

subset(inputDF, regexpr(studyid_subjid, inputDF$STUDYID_SUBJID) > 0)
声明。regexpr是贪婪的,它将匹配模式的所有匹配项,而不仅仅是精确匹配项。在没有看到您的数据的情况下,我怀疑存在多个匹配项,其中预期只有一个精确匹配项。如本例所示:

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

祝你好运

@我只是好奇为什么这被否决了?1) 我已经展示了一个有效的尝试2)发布了结果3)形成了一个有效的问题:为什么返回的行比预期的多。是的,我没有发布数据,没有要求发布数据的Stackoverflow规则。
list<-c("example1", "example2", "example10")
regexpr("example1", list)>0
#[1]  TRUE FALSE  TRUE
which("example1"== list)