R 删除日期以特定ID为条件的行
基本上,我有一个包含ID、日期、VolumeX和VolumeY的数据框 我想将VolumeX数据帧分割为特定于ID的VolumeY的最大日期之前和之后 前 df看起来与许多不同的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 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类中了。我还为上一段代码添加了一些解释,希望对您有所帮助!还要注意的是,符号的替换并不是严格需要的,但我已经包含了它,这样以后在转换为数字时就不会出现错误,这是非常完美的-非常感谢!非常感谢您的详细解释!