Как я могу скопировать и добавить строки данных, чтобы заполнить недостающие записи в определенной последовательности? - PullRequest
2 голосов
/ 01 мая 2019

У меня есть последовательность числовых меток для записей, которые могут совместно использоваться переменным числом записей на метку (labelsequence).У меня также есть сами записи, но, к сожалению, для некоторых значений последовательности все записи были потеряны (датафрейм df).Мне нужно определить, когда числовая метка из labelsequence не отображается в столбце метки df, скопировать все записи в пределах df, которые связаны с ближайшим значением метки, которое меньше отсутствующего значения, и добавить этинедавно заполненному фрейму данных, скажем df2.

Я пытаюсь выполнить это в R (ответ dplyr был бы идеальным), и посмотрел на ответы на вопросы, касающиеся заполнения пропущенных строк, например,as Заполнение пропущенных строк в R и Заполнение пропущенных строк в фрейме данных и приведенное ниже рабочее решение. Интересно, есть ли у кого-нибудь лучший способ сделать это.

Взять, к примеру, данные этого примера:

labelsequence<-data.frame(label=c(1,2,3,4,5,6))

и

df<-data.frame(label=c(1,1,1,1,3,3,4,4,4),
           place=c('vermont','kentucky',
                   'wisconsin','wyoming','nevada',
                   'california','utah','georgia','kentucky'),
           animal=c('wolf','wolf','cougar','cougar','lamb',
                    'cougar','donkey','lamb','wolf'))

с желаемым результатом ...

desired_df2<-data.frame(label=c(1,1,1,1,2,2,2,2,3,3,4,4,4,5,5,5,6,6,6),
            place=c('vermont','kentucky',
                    'wisconsin','wyoming','vermont','kentucky',
                    'wisconsin','wyoming','nevada',
                    'california','utah','georgia','kentucky','utah',
                    'georgia','kentucky','utah','georgia','kentucky'),
            animal=c('wolf','wolf','cougar','cougar','wolf',
                     'wolf','cougar','cougar','lamb','cougar',
                     'donkey','lamb','wolf','donkey','lamb','wolf',
                     'donkey','lamb','wolf'))

Есть ли лучше (будь то эффективность кода, гибкость или эффективность ресурсов), чем следующие?

df2<- df %>%
full_join(expand.grid(label=unique(df$label),newlabel=labelsequence$label)) %>%
  mutate(missing = ifelse(newlabel %in% label,0,1))%>%
  filter(label<newlabel)%>%
   group_by(newlabel) %>%
  filter(label==max(label) & missing ==1) %>%
  ungroup()%>%
  mutate(label=newlabel,missing=NULL,newlabel=NULL) %>%
  bind_rows(df) %>%
  arrange(label)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...