如何根据日期差异对数据框进行子集化?

时间:2021-03-17 05:42:35

标签: r

我有两个数据框,我想对 df2 中的特定行进行子集化。这是 df1 和 df2:

df1:
   Sdate    columnA    D
2020-05-14    DD       1
2020-05-14    FF       5
2020-05-14    EE       6
2020-05-14    GG       7

df2:
   Sdate      ColA     C
2020-04-13    NN       1
2020-04-13    XX       1
2020-04-14    VV       5
2020-04-15    DD       6
2020-04-16    AA       7

以下是获得最终输出的步骤:

  1. 我需要计算 df1 的 [1,1](即“2020-05-14”)和 df2 的 [1,1](即“2020-04-13”)之间的日期差异
  2. 我需要弄清楚差异是否大于 10 天。
  3. 最后,如果超过 10 天,我想删除 df2 中日期最早的行。因为 2020-04-13 是 df2 中最早的日期,所以我想删除 df2 的前两个低点。

"2020-05-14" - "2020-04-13" 是 31。因此,我的 df2 最终输出应该是

   Sdate     ColA      C
2020-04-14    VV       5
2020-04-15    DD       6
2020-04-16    AA       7

我尝试使用以下代码:

df2 <- ifelse(as.numeric(as.Date(as.character(df1[1,1]), format="%Y-%m-%d")-
                         as.Date(as.character(df2[1,1]), format="%Y-%m-%d"))>10,
                       subset(df2, Sdate!= df2[1,1]),print("Pass"))

我分三部分分别测试了这段代码,它们运行良好。但它不在上面的组合代码中。 df2 只是随代码一起消失了。

我应该改变什么才能得到我想要的?

1 个答案:

答案 0 :(得分:1)

您可以为此使用 dplyr。我提供了一种方法,您不需要比较第一行,而只需取最小值即可。

library(dplyr)

new_df <- df2 %>% 
  mutate(
    isOldest = Sdate == min(Sdate),
    deleteOldest = as.integer(min(df1$Sdate) - min(Sdate)) > 10
  ) %>% 
  filter(!(isOldest & deleteOldest))

如果您实际上只需要比较第一行:

new_df <- df2 %>% 
  mutate(
    isOldest = Sdate == df2$Sdate[1],
    deleteOldest = as.integer(df1$Sdate[1] - df2$Sdate[1]) > 10
  ) %>% 
  filter(!(isOldest & deleteOldest))

希望这是您所需要的。下面的数据框。

df1 <- data.frame(
  Sdate = as.Date('2020-05-14'),
  columnA = c('DD', 'FF', 'EE', 'GG'),
  D = c(1, 5, 6, 7),
  stringsAsFactors = FALSE
)

df2 <- data.frame(
  Sdate = as.Date(c(rep('2020-04-13', 2), '2020-04-14', '2020-04-15',' 2020-04-16')),
  colA = c('NN', 'XX', 'VV', 'DD', 'AA'),
  C = c(1, 1, 5, 6, 7),
  stringsAsFactors = FALSE
)