r функция поиска, возвращающая отрицательные даты

Я новичок в Р.

У меня есть таблица с некоторыми отсутствующими данными, которые я хотел бы обновить из справочной таблицы.

Пример таблицы данных:

df1=data.frame(id=c(1:5),dob=as.Date(c("1/1/2001"
     ,"2/2/2002",NA,NA,NA),"%m/%d/%Y"),other_data=paste0("data",seq(1:5)))

Пример таблицы поиска:

 bd_ref<-data.frame(id=c(1:100),dob=as.Date(rep("1/1/1999"),"%m/%d/%Y"))

Результаты должны быть:

  id dob             other_data
1  1 2001-01-01      data1
2  2 2002-02-02      data2
3  3 1999-01-01      data3
4  4 1999-01-01      data4
5  5 1999-01-01      data5

Сначала я определил недостающие данные, а затем попытался использовать функцию lookup из пакета qdapTools на основе этого ответа Простой поиск для вставки значений во фрейм данных R следующим образом:

df1[is.na(df1$доб),"доб"]‹-df1[is.na(df1$доб),"id"] %l% d_ref[,c("id","доб")]

но получил ошибку:

Error in as.Date.numeric(value) : 'origin' must be supplied

Похоже, что результаты df1[is.na(df1$dob),"id"] %l% d_ref[,c("id","dob")] были не датами, а отрицательными числами.

[1] -719144 -719144 -719144

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


person user2909302    schedule 26.02.2016    source источник
comment
кто бы ни проголосовал за этот вопрос, пожалуйста, предложите конструктивную критику относительно того, как я мог бы улучшить вопрос.   -  person user2909302    schedule 26.02.2016
comment
Для этой задачи не нужны никакие пакеты. Просто: df1$dob[is.na(df1$dob)] <- bd_ref$dob[match(df1$id, bd_ref$id)][is.na(df1$dob)] сделает это. (я не минусующий)   -  person thelatemail    schedule 26.02.2016
comment
@thelatemail Только что получил это решение для работы с моим исходным набором данных. Потрясающе, спасибо!   -  person user2909302    schedule 26.02.2016


Ответы (1)


Вы можете попробовать что-то подобное с библиотекой dplyr. Я предлагаю вам выполнить каждую строку и посмотреть, что происходит с шагами.

library(dplyr)
df <- inner_join(df1, bd_ref, by = 'id')
df$dob.x <- as.Date(ifelse(!is.na(df$dob.x), df$dob.x, df$dob.y), origin = '1970-01-01')
df <- select(df, -dob.y)
names(df)[2] <- 'dob'
df
  id        dob other_data
1  1 2001-01-01      data1
2  2 2002-02-02      data2
3  3 1999-01-01      data3
4  4 1999-01-01      data4
5  5 1999-01-01      data5
person Gopala    schedule 26.02.2016
comment
Спасибо @Gopala, что сработало для меня, и было полезно посмотреть, что происходит. - person user2909302; 26.02.2016