あなたの最後の例では、データに応じてIDが3の場合はWithin_7days値が1になります。
パッケージlubridate
は時代の作業に最適です。また、データセットの操作にはdplyr
を使用します。
# Load Libraries
library(dplyr)
library(lubridate)
# Recreate dataframes
df1 <- data.frame(ID = 1:3, Date.Discharged = c("2014-08-04","2014-12-10","2015-01-01"))
df2 <- data.frame(ID = c(1,2,2,3), CheckDate = c("2014-08-11","2014-12-14","2015-05-01","2015-01-05"))
# Make the characters in Date.Discharged and CheckDate into Date objects:
df1$Date.Discharged <- as.Date(df1$Date.Discharged)
df2$CheckDate <- as.Date(df2$CheckDate)
私はあなたがチェックイン日の各IDの最小値のみを気にしているとします。そうすれば、最小値を選択すると、同じIDを持つ複数のエントリの問題を取り除くことができます。
df2 <- df2 %>% group_by(ID) %>% summarize(CheckDate = min(CheckDate))
# Now join the 2 dataframes together
df1 <- left_join(df1,df2) # this joins by ID by default
は最後に、我々はY/Nで列を作る
df1 <- df1 %>% mutate(within_7days = (CheckDate <= Date.Discharged + days(7))*1)
df1
ID Date.Discharged CheckDate within_7days
1 1 2014-08-04 2014-08-11 1
2 2 2014-12-10 2014-12-14 1
3 3 2015-01-01 2015-01-05 1
EDIT:
これはやや非効率的ですが、第二のデータセット内の値を持っている場合を処理しますこれらは放電日前に発生します。
上記の行は無視できます:
df2 <- df2 %>% group_by(ID) %>% summarize(CheckDate = min(CheckDate))
、代わりに参加するステップに直進し、次のように変更します。これは、同じIDのために排出されたそれぞれの日に行わCheckDatesのすべてを追加します
df1 <- left_join(df1,df2) %>% filter(CheckDate > Date.Discharged)
。これは、DF1のIDが一意であると仮定しています。
2番目のdfにIDが2回以上表示されますか? – Gopala
はい、いくつかのIDは2番目のdfに2回以上表示されます。 – AlternativeHacks