R语言 如何按唯一值对变量进行累计求和并输入回

wgeznvg7  于 2023-01-22  发布在  其他
关注(0)|答案(3)|浏览(135)

我期待着做以下-累计和指标值,并删除这些天后的指标原始:
| 交易|日|指示器|
| - ------|- ------|- ------|
| 1个|1个|无|
| 1个|第二章|无|
| 1个|三个|无|
| 1个|四个|1个|
| 1个|五个|1个|
| 1个|六个|1个|
| 第二章|1个|无|
| 第二章|第二章|无|
| 第二章|三个|无|
| 第二章|四个|无|
| 第二章|五个|1个|
| 第二章|六个|1个|
把新table做成这样--
| 交易|日|指示器|
| - ------|- ------|- ------|
| 1个|1个|无|
| 1个|第二章|无|
| 1个|三个|无|
| 1个|四个|三个|
| 第二章|1个|无|
| 第二章|第二章|无|
| 第二章|三个|无|
| 第二章|四个|无|
| 第二章|五个|第二章|

rvpgvaaj

rvpgvaaj1#

将指示符== 1的全天更改为指示符== 1的第一天

df%>%
  group_by(transaction)%>%
  mutate(day=case_when(indicator==0~day,
                       T~head(day[indicator==1],1)))%>%
  group_by(transaction,day)%>%
  summarise(indicator=sum(indicator))%>%
  ungroup

  transaction   day indicator
        <int> <int>     <int>
1           1     1         0
2           1     2         0
3           1     3         0
4           1     4         3
5           2     1         0
6           2     2         0
7           2     3         0
8           2     4         0
9           2     5         2
yh2wf1be

yh2wf1be2#

请尝试以下代码
编号

df <- bind_rows(df1, df2) %>% group_by(transaction) %>% 
mutate(cumsum=cumsum(indicator), cumsum2=ifelse(cumsum==1, day, NA)) %>% 
fill(cumsum2) %>% 
mutate(day=ifelse(!is.na(cumsum2), cumsum2, day)) %>% 
group_by(transaction, day) %>% slice_tail(n=1) %>% select(-cumsum2)

创建于2023年1月19日,使用reprex v2.0.2

输出

# A tibble: 8 × 4
# Groups:   transaction, day [8]
  transaction   day indicator cumsum
        <dbl> <int>     <dbl>  <dbl>
1           1     1         0      0
2           1     2         0      0
3           1     3         0      0
4           1     4         1      3
5           2     1         0      0
6           2     2         0      0
7           2     3         0      0
8           2     4         1      2
nkoocmlb

nkoocmlb3#

另一种尝试方法。按transaction分组后,将indicator更改为0(相同)或indicatorsum。最后,保留或filter以前的行,其中indicatorcumall(所有累积)值为0。使用lag将提供包含总和的最后一行。

library(tidyverse)

df %>%
  group_by(transaction) %>%
  mutate(indicator = ifelse(indicator == 0, 0, sum(indicator))) %>%
  filter(cumall(lag(indicator, default = 0) == 0))
    • 产出**
transaction   day indicator
        <int> <int>     <dbl>
1           1     1         0
2           1     2         0
3           1     3         0
4           1     4         3
5           2     1         0
6           2     2         0
7           2     3         0
8           2     4         0
9           2     5         2

相关问题