2017-12-22 1 views
-8

Ich habe folgende Datenrahmen:Suche Datum am nächsten bestimmten Datum rudern

enter image description here

erste Spalte enthält Identifikationsnummern (respnr) zweite Spalte enthält Stichtag pro Identifikationsnummer (cdatalg) 3. bis 16. Spalte enthält Daten (Datumsbereich1: Datumsbereich14)

Ich möchte eine 17. Spalte eingeben, in der das Datum in Spalte 3:16 gedruckt wird, das dem Bezugsdatum in Spalte 2 am nächsten ist. Ich habe Kombinationen von App versucht ly und which.min und neardate, kann es aber nicht herausfinden.

Ein Push in die richtige Richtung würde sehr geschätzt werden.

+0

Willkommen bei StackOverflow! Bitte lesen Sie die Informationen über [wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to-ask) und wie man ein [reproduzierbares Beispiel gibt] (http://stackoverflow.com/questions/ 5963269/how-to-make-a-great-r-reproduzierbares Beispiel/5963610). Dies wird es anderen sehr erleichtern, Ihnen zu helfen. – Jaap

+2

Auch: Verwenden Sie niemals Bilder, um Ihre Daten zu zeigen. Siehe auch die Links von meinem vorherigen Kommentar. – Jaap

Antwort

0

Dieses einfache Beispiel werden Ihnen helfen:

# example data 
df = data.frame(id = c("A","B"), 
       date_ref = c("2013-01-26", "2013-01-08"), 
       date1 = c("2013-01-23", "2013-01-01"), 
       date2 = c("2013-01-20", "2013-01-07"), 
       stringsAsFactors = F) 

df 

# id date_ref  date1  date2 
# 1 A 2013-01-26 2013-01-23 2013-01-20 
# 2 B 2013-01-08 2013-01-01 2013-01-07 

library(dplyr) 
library(lubridate) 
library(tidyr) 

# update date column to datetime variables 
# (if needed) 
df = df %>% mutate_at(vars(matches("date")), ymd) 

df %>% 
    gather(type,date_new,-id,-date_ref) %>%  # reshape dataset 
    group_by(id) %>%        # for each id 
    filter(abs(difftime(date_ref, date_new)) == min(abs(difftime(date_ref, date_new)))) %>% # keep row with minimum distance between dates 
    ungroup() %>%         # forget the grouping 
    select(-type) %>%        # remove that variable 
    inner_join(df, by=c("id","date_ref"))   # join back original dataset 

# # A tibble: 2 x 5 
#  id date_ref date_new  date1  date2 
# <chr>  <date>  <date>  <date>  <date> 
# 1  A 2013-01-26 2013-01-23 2013-01-23 2013-01-20 
# 2  B 2013-01-08 2013-01-07 2013-01-01 2013-01-07 

Nicht sicher, wenn Sie mehrere Tage, mit dem gleichen Abstand haben können (vor dem gleichen Datum mehrmals von derselben Anzahl von Tagen/nach dem Basisdatum) und wie Sie möchte sie behandeln.

Verwandte Themen