Добавление строк в разные фреймы данных программно - PullRequest
0 голосов
/ 05 июля 2019

Я создаю фрейм данных динамически, и я использую пользовательские имена для обращения к этим фреймам данных. Однако я могу успешно создавать фреймы данных динамически и добавлять информацию по отдельности, но вручную, когда я пытаюсь добавить запись, он запускаетдействие, но ничего не происходит.Я могу открыть фрейм данных, и он отображается как пустой

#Extract unique machines on the system 
machines <- unique(wo_raw$MACHINE)
for(machine in machines){
  #Check if the machine is present on current data frames or has a record
  if(exists(machine) && is.data.frame(get(machine))){
    #Machine already exists on the system
    cat(machine," is a dataframe","\n")

    netlbs <- subset(wo_raw,((wo_raw$TYPE =="T" & wo_raw$TYPE2=="E") | (wo_raw$TYPE == "T" & is.na(wo_raw$TYPE2))) & wo_raw$WEEK<=curWeek & wo_raw$MACHINE == machine & wo_raw$YEAR == curYear,select = NET_LBS)

    scraplbs<- subset(wo_raw,((wo_raw$TYPE =="T" & wo_raw$TYPE2=="E") | (wo_raw$TYPE == "T" & is.na(wo_raw$TYPE2))) & wo_raw$WEEK<=curWeek & wo_raw$MACHINE == machine & wo_raw$YEAR == curYear,select = SCRAP_LBS)

    if(is.data.frame(netlbs) && nrow(netlbs)!=0){
      totalNet<- sum(netlbs)
      totalScrap<- sum(scraplbs)
      scrapRate <- percent(totalScrap/(sum(totalNet,totalScrap)),accuracy = 2)
      tempDf<-data.frame(curYear,curMonth,curDay,curWeek,totalNet,totalScrap,scrapRate)
      names(tempDf)<-c("year","month","day","week","net_lbs","scrap_lbs","scrap_rate")

      cat("Total Net lbs for ",machine,": ",totalNet,"\n")
      cat("Total Scrap lbs for ",machine,": ",totalScrap,"\n")
      cat("Total Scrap Rate for ",machine,": ",scrapRate,"\n")
      #machine<-rbind(get(machine),tempDf)
      #assign(machine,rbind(machine,tempDf))
      add_row(get(machine),year=curYear,
                           month=curMonth,
                           day=curDay,
                           week=curWeek,
                           net_lbs=totalNet,
                           scrap_lbs=totalScrap,
                           scrap_rate=scrapRate)
      cat("added row \n")
    }
    #info<-c(curYear,curMonth,curDay,curWeek,netlbs)
    #cat("Total Net lbs: ",netlbs,"\n")
    #netlbs <-NULL


  }else{
    cat("Creating machine dataframe: ",machine,"\n")
    #Create a dataframe labeled with machine name contining
    #date information, net lbs,scrap lbs and scrap rate
    assign(paste0(machine,""),data.frame(year=integer(),
                                         month=integer(),
                                         day=integer(),
                                         week=integer(),
                                         net_lbs=double(),
                                         scrap_lbs=double(),
                                         scrap_rate=integer()
                                          )
          )
    #machine$year<-curYear

  }
  #machine<-NULL


}

Все функции, которые я пробовал, находятся в закомментированных строках из предыдущих ответов, найденных в Переполнении стека.Я начал работать с for, но я не думаю, что это было бы реально выполнимо, так как он потребляет много ресурсов, плюс он не работает хорошо при обработке различных типов данных.Кто-нибудь имеет представление о том, что происходит, у меня нет ошибки, чтобы пройти.

1 Ответ

0 голосов
/ 05 июля 2019

Я думаю, ваш код нуждается в значительной очистке. На каждом этапе убедитесь, что вы сами знаете, что именно вы делаете.

Некоторые подсказки:

  • Попробуйте сделать свой код автономным. Если я запускаю ваш код, я сразу получаю сообщение об ошибке, так как я не определил wo_raw. Я понимаю, что это какой-то data.frame, но что именно там? Что мне нужно сделать, чтобы попытаться запустить ваш код? Также с такими переменными, как curYear. Я понимаю, что это должен быть 2019 год, но мне нужно набрать очень много, чтобы просто решить проблему, я не могу просто скопировать и вставить.
  • Если вы используете какие-либо библиотеки, пожалуйста, укажите для них строку. Я не знаю, что add_row делает или должен делать. Так что я тоже не знаю, ошибаются ли там ваши ожидания?
  • Постарайтесь сделать свой код минимальным, прежде чем публиковать его здесь. Мне нравятся комментарии и cat s повсюду, но почему такая строка, как netlbs <- subset(wo_raw,((wo_raw$TYPE =="T" & wo_raw$TYPE2=="E") | (wo_raw$TYPE == "T" & is.na(wo_raw$TYPE2))) & wo_raw$WEEK<=curWeek & wo_raw$MACHINE == machine & wo_raw$YEAR == curYear,select = NET_LBS)? Для этой проблемы достаточно всего лишь subset(wo_raw, wo_raw$mach==machine, net)
  • Я понял, что код работает, но постарайтесь выяснить, где вы используете какие объекты. if (is.data.frame(netlbs)) {total=sum(netlbs)} может работать, но суммирование data.frame, в то время как вам нужен столбец, приводит к путанице.
  • При использовании переменных для хранения имен других переменных, таких как вы, будьте очень осведомленными о том, к чему вы на самом деле ссылаетесь. По этой причине, как правило, рекомендуется избегать этих конструкций, почти всегда проще сохранять результаты в списке или в чем-то подобном
  • Приходите к этому: переменная machine это , а не a data.frame, это character. character - это имя другой переменной, которая является data.frame. Итак (закомментировано) Я вижу некоторые случаи machine <- NULL и machine$year, это не так. Как rbind(machine, ...), так как машина не является data.frame

Как говорится, я думаю, вы подошли к assign заявлению. assign(machine,rbind(get(machine),tempDf)) работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...