У меня есть последовательность числовых меток для записей, которые могут совместно использоваться переменным числом записей на метку (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)