R 删除日期以特定ID为条件的行

R 删除日期以特定ID为条件的行,r,subset,nested-loops,R,Subset,Nested Loops,基本上,我有一个包含ID、日期、VolumeX和VolumeY的数据框 我想将VolumeX数据帧分割为特定于ID的VolumeY的最大日期之前和之后 前 df看起来与许多不同的ID类似: ID Date VolX VolY 1 2018 - 02- 01 5 - 1 2018 - 03- 01 6 - 1 2018 - 08- 01 3 - 1 2018 - 10- 01 1 - 1 201

基本上,我有一个包含ID、日期、VolumeX和VolumeY的数据框

我想将VolumeX数据帧分割为特定于ID的VolumeY的最大日期之前和之后

df看起来与许多不同的ID类似:

ID  Date            VolX   VolY
1   2018 - 02- 01   5      -
1   2018 - 03- 01   6      -
1   2018 - 08- 01   3      -
1   2018 - 10- 01   1      -
1   2017 - 02- 01   -      1
1   2014 - 10- 01   -      0
1   2014 - 11- 01   -      5
1   2018 - 02- 01   -      0 
因此,对于每个ID的最大VolY日期,我想将数据帧分为两个:每个ID的该日期之前和之后,以便对VolY max date之前和之后的VolX求和


似乎这需要某种嵌套for循环。我能够提取最大日期和总体积。。。只是很难选择出特定于ID的

这就是你想要的吗

library(dplyr)

df %>%
  replace(., . == "-", NA) %>%
  mutate(Date = as.Date(gsub("\\s", "", Date))) %>%
  mutate_at(vars(VolX, VolY), as.numeric) %>%
  group_by(ID, Before_After = cumsum(c(0, lag(+(Date == max(Date)))[-1]))) %>%
  mutate(
    sum_Volx = sum(VolX[Date != max(Date)], na.rm = T),
    sum_VolY = sum(VolY[Date != max(Date)], na.rm = T)
  ) %>% ungroup() %>% select(-Before_After)
输出:

# A tibble: 8 x 6
     ID Date        VolX  VolY sum_Volx sum_VolY
  <int> <date>     <dbl> <dbl>    <dbl>    <dbl>
1     1 2018-02-01     5    NA       14        0
2     1 2018-03-01     6    NA       14        0
3     1 2018-08-01     3    NA       14        0
4     1 2018-10-01     1    NA       14        0
5     1 2017-02-01    NA     1        0        6
6     1 2014-10-01    NA     0        0        6
7     1 2014-11-01    NA     5        0        6
8     1 2018-02-01    NA     0        0        6
# A tibble: 8 x 8
     ID Date        VolX  VolY sum_Volx_Before sum_VolY_Before sum_Volx_After sum_VolY_After
  <int> <date>     <dbl> <dbl>           <dbl>           <dbl>          <dbl>          <dbl>
1     1 2018-02-01     5    NA              14               0              0              6
2     1 2018-03-01     6    NA              14               0              0              6
3     1 2018-08-01     3    NA              14               0              0              6
4     1 2018-10-01     1    NA              14               0              0              6
5     1 2017-02-01    NA     1              14               0              0              6
6     1 2014-10-01    NA     0              14               0              0              6
7     1 2014-11-01    NA     5              14               0              0              6
8     1 2018-02-01    NA     0              14               0              0              6
Before

# A tibble: 1 x 4
# Groups:   ID [1]
     ID Before_After sum_VolX sum_VolY
  <int>        <dbl>    <dbl>    <dbl>
1     1            0       14        0

After

# A tibble: 1 x 4
# Groups:   ID [1]
     ID Before_After sum_VolX sum_VolY
  <int>        <dbl>    <dbl>    <dbl>
1     1            1        0        6
输出:

# A tibble: 8 x 6
     ID Date        VolX  VolY sum_Volx sum_VolY
  <int> <date>     <dbl> <dbl>    <dbl>    <dbl>
1     1 2018-02-01     5    NA       14        0
2     1 2018-03-01     6    NA       14        0
3     1 2018-08-01     3    NA       14        0
4     1 2018-10-01     1    NA       14        0
5     1 2017-02-01    NA     1        0        6
6     1 2014-10-01    NA     0        0        6
7     1 2014-11-01    NA     5        0        6
8     1 2018-02-01    NA     0        0        6
# A tibble: 8 x 8
     ID Date        VolX  VolY sum_Volx_Before sum_VolY_Before sum_Volx_After sum_VolY_After
  <int> <date>     <dbl> <dbl>           <dbl>           <dbl>          <dbl>          <dbl>
1     1 2018-02-01     5    NA              14               0              0              6
2     1 2018-03-01     6    NA              14               0              0              6
3     1 2018-08-01     3    NA              14               0              0              6
4     1 2018-10-01     1    NA              14               0              0              6
5     1 2017-02-01    NA     1              14               0              0              6
6     1 2014-10-01    NA     0              14               0              0              6
7     1 2014-11-01    NA     5              14               0              0              6
8     1 2018-02-01    NA     0              14               0              0              6
Before

# A tibble: 1 x 4
# Groups:   ID [1]
     ID Before_After sum_VolX sum_VolY
  <int>        <dbl>    <dbl>    <dbl>
1     1            0       14        0

After

# A tibble: 1 x 4
# Groups:   ID [1]
     ID Before_After sum_VolX sum_VolY
  <int>        <dbl>    <dbl>    <dbl>
1     1            1        0        6
让我们一个接一个地看一下:

首先,我们用NA替换-符号,这不是严格需要的,只是为了避免以后出现错误; 然后将VolX和VolY变换为数值; 然后我们按ID分组,以便将所有内容分别应用于每个组; 然后,我们将日期转换为适当的日期格式; 然后它是关键部分:我们计算列前_后的标志,如果在前一行中观察到最大日期,我们首先用1标记;之后,我们计算该列的累积和,使得此事件之前的所有内容都是0,之后的所有内容都是1; 然后过滤掉最长日期; 我们再次按ID分组,并在指示符之前和之后分组; 我们使用summary收缩数据框,使其仅包含各个列的总和; 我们通过在列前\后拆分,将数据帧转换为两个不同的数据帧; 由于得到的结果是一个包含2个数据帧的列表,我们需要将它们放入全局环境中,因此首先我们为每个数据帧指定名称,然后将它们转换为“适当的”数据帧。 输出:

# A tibble: 8 x 6
     ID Date        VolX  VolY sum_Volx sum_VolY
  <int> <date>     <dbl> <dbl>    <dbl>    <dbl>
1     1 2018-02-01     5    NA       14        0
2     1 2018-03-01     6    NA       14        0
3     1 2018-08-01     3    NA       14        0
4     1 2018-10-01     1    NA       14        0
5     1 2017-02-01    NA     1        0        6
6     1 2014-10-01    NA     0        0        6
7     1 2014-11-01    NA     5        0        6
8     1 2018-02-01    NA     0        0        6
# A tibble: 8 x 8
     ID Date        VolX  VolY sum_Volx_Before sum_VolY_Before sum_Volx_After sum_VolY_After
  <int> <date>     <dbl> <dbl>           <dbl>           <dbl>          <dbl>          <dbl>
1     1 2018-02-01     5    NA              14               0              0              6
2     1 2018-03-01     6    NA              14               0              0              6
3     1 2018-08-01     3    NA              14               0              0              6
4     1 2018-10-01     1    NA              14               0              0              6
5     1 2017-02-01    NA     1              14               0              0              6
6     1 2014-10-01    NA     0              14               0              0              6
7     1 2014-11-01    NA     5              14               0              0              6
8     1 2018-02-01    NA     0              14               0              0              6
Before

# A tibble: 1 x 4
# Groups:   ID [1]
     ID Before_After sum_VolX sum_VolY
  <int>        <dbl>    <dbl>    <dbl>
1     1            0       14        0

After

# A tibble: 1 x 4
# Groups:   ID [1]
     ID Before_After sum_VolX sum_VolY
  <int>        <dbl>    <dbl>    <dbl>
1     1            1        0        6

请注意,0对应于Before,1对应于After。

您好,请显示您迄今为止尝试过的代码好吗?我认为这是可行的-从charToDatex获取错误字符串不是标准的明确格式。。。对于我的df,classdf$Date是Date,所以我不确定这是怎么回事?而且这可能要求很多,我一直想更多地了解tidyverse函数,它们显然非常有用!你能简单地介绍一下你使用的函数吗?我现在才知道你的日期列格式很奇怪——我试着用gsub来纠正这个问题,也许现在你可以重新运行并检查。否则,解决方案就是从代码中删除Date=gsub…,因为正如您所说,您的列已经在Date类中了。我还为上一段代码添加了一些解释,希望对您有所帮助!还要注意的是,符号的替换并不是严格需要的,但我已经包含了它,这样以后在转换为数字时就不会出现错误,这是非常完美的-非常感谢!非常感谢您的详细解释!