Ошибка в fix.by (by.x, x) : ‘by’ должно соответствовать номерам столбцов Ошибка в fix.by (by.x, x) : ‘by’ должно соответствовать номерам столбцов

#r

#r

Вопрос:

У меня есть фрейм данных df_forecast, содержащий данные о потреблении по дате. Некоторые даты отсутствуют. Поэтому я подумал создать еще один фрейм данных с учетом даты начала и даты окончания df_forecast и заполнить его последовательной датой, затем выполнить левое соединение с df_forecast и учесть значение последней даты для отсутствующих дат. Поэтому я написал следующий код

 startDate=min(df_forecast$Date1)
endDate=max(df_forecast$Date1)
dateSeq=seq(as.Date(startDate), as.Date(endDate), by="days")
df_date=data.frame(dateSeq)  
 

Но пока я пытаюсь объединить df_date с df_forecast, используя приведенный ниже код

 merge(df_date,df_forecast,by.x=dateSeq,by.y=Date1,all.x=True)
 

Я получаю сообщение об ошибке

 Error in fix.by(by.x, x) : 'by' must match numbers of columns Error in fix.by(by.x, x) : 'by' must  match numbers of columns
Error in fix.by(by.x, x) : 'by' must match numbers of columns
 

Обе переменные в merge by относятся к типу данных Date.
Можете ли вы предложить мне, как решить эту проблему или какой-либо альтернативный подход?

Ответ №1:

Это была моя первая попытка решить ту же проблему, но я нашел «полную» функцию в tidyverse, которая делает то, что вы хотите (описание блога Кана Нисиды здесь: https://blog.exploratory.io/populating-missing-dates-with-complete-and-fill-functions-in-r-and-exploratory-79f2a321e6b5). Вот код для настройки воспроизводимого примера и демонстрации функции.

 # Setting up replicable example
start_date <- Sys.Date()
end_date <- start_date   24
date_vec <- seq.Date(from = start_date, to = end_date, by = "day")
set.seed(101)
other_data <- sample(1:25, 25)
data1 <- as.data.frame(cbind(date_vec, other_data))
data1$date_vec <- as.Date(data1$date_vec, origin = "1970-01-01")
set.seed(101)
n <- 5
# Remove 5 random rows
to_remove <- sample(data1$date_vec, n)
data_incomplete <- data1[!data1$date_vec %in% to_remove, ]
# Check it
data_incomplete
# Add rows back, other_data will be NA
data_incomplete %>% 
  mutate(date_vec = as.Date(date_vec)) %>% 
  complete(date_vec = seq.Date(from = min(date_vec), to = max(date_vec), by = "day"))
 

Ответ №2:

Вам нужно ссылаться на столбцы как на строки. Для слияния, если вы добавляете сам столбец, он интерпретирует его как массив имен столбцов.

Столбцы для объединения могут быть указаны по имени, номеру или с помощью логического вектора: имя «row.names» или число 0 указывает имена строк. Если указано по имени, оно должно однозначно соответствовать именованному столбцу во входных данных.

 merge(df_date,df_forecast,by.x='dateSeq',by.y='Date1',all.x=True)
 

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