【问题标题】:How to replace some values with max values from cumsum within groups如何用组内 cumsum 的最大值替换某些值
【发布时间】:2020-03-25 18:20:14
【问题描述】:

我正在尝试计算在上学期间接触过支持网络的学生的累积总和。

示例数据框将是(ID=学生,学期=感兴趣的学期,支持=接触支持网络):

df <- data.frame(ID=c(123451, 123451, 123451, 123451, 123452, 123452, 123452, 123452, 
                      123452, 123452, 123452, 123453, 123453, 123453, 123453, 123453, 123453, 123453, 123453),
                 Term= c(1141, 1148, 1158, 1141, 1158, 1161, 1148, 1151, 1158, 1138, 
                         1141, 1138, 1141, 1141, 1148, 1138, 1148, 1158, 1161), 
                 Support = c(1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1))

由于我正在寻找累积曝光(从他们最早的学期开始),我首先按 ID 和 Term 对数据进行排序: df &lt;- df[order(df[,1], df[,2]),]

然后我将 Support 变量的累积总和计算到单独的列中

df$Dosage &lt;- ave(df[3], df[1], FUN=cumsum)

输出:

       ID Term Support Dosage
1  123451 1141       1       1
4  123451 1141       1       2
2  123451 1148       0       2
3  123451 1158       1       3
10 123452 1138       0       0
11 123452 1141       0       0
7  123452 1148       1       1
8  123452 1151       1       2
5  123452 1158       1       3
9  123452 1158       1       4
6  123452 1161       0       4
12 123453 1138       1       1
16 123453 1138       0       1
13 123453 1141       0       1
14 123453 1141       1       2
15 123453 1148       0       2
17 123453 1148       1       3
18 123453 1158       1       4
19 123453 1161       1       5

虽然这很有用,但如果学生在同一学期有两行,我希望 Dosage 的值反映最大值。

所以对于 Student=123451 和 Term=1141,我希望两个剂量值都等于 2。

对于 Student=123452 和 Term=1158,我希望两个剂量值都等于 4。

对于 Student=123453 和 Term=1148,我希望两个剂量值都等于 3。

预期输出:

       ID Term Support Dosage
1  123451 1141       1       2
4  123451 1141       1       2
2  123451 1148       0       2
3  123451 1158       1       3
10 123452 1138       0       0
11 123452 1141       0       0
7  123452 1148       1       1
8  123452 1151       1       2
5  123452 1158       1       4
9  123452 1158       1       4
6  123452 1161       0       4
12 123453 1138       1       1
16 123453 1138       0       1
13 123453 1141       0       2
14 123453 1141       1       2
15 123453 1148       0       3
17 123453 1148       1       3
18 123453 1158       1       4
19 123453 1161       1       5

【问题讨论】:

  • 你能显示预期的输出吗
  • 我添加了预期的输出。谢谢大家的帮助!

标签: r cumsum


【解决方案1】:

不太明白你的问题是什么,但也许你可以试试这个:


library(dplyr)


df <- data.frame(ID=c(123451, 123451, 123451, 123451, 123452, 123452, 123452, 123452, 
                      123452, 123452, 123452, 123453, 123453, 123453, 123453, 123453, 123453, 123453, 123453),
                 Term= c(1141, 1148, 1158, 1141, 1158, 1161, 1148, 1151, 1158, 1138, 
                         1141, 1138, 1141, 1141, 1148, 1138, 1148, 1158, 1161), 
                 Support = c(1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1))


df %>% 
  arrange(ID, Term) %>%
  group_by(ID) %>%
  mutate(Dosage = cumsum(Support)) %>%
  ungroup() %>%
  group_by(ID, Term) %>%
  mutate(Dosage = max(Dosage)) %>%
  ungroup()
       ID  Term Support Dosage
 1 123451  1141       1      2
 2 123451  1141       1      2
 3 123451  1148       0      2
 4 123451  1158       1      3
 5 123452  1138       0      0
 6 123452  1141       0      0
 7 123452  1148       1      1
 8 123452  1151       1      2
 9 123452  1158       1      4
10 123452  1158       1      4
11 123452  1161       0      4
12 123453  1138       1      1
13 123453  1138       0      1
14 123453  1141       0      2
15 123453  1141       1      2
16 123453  1148       0      3
17 123453  1148       1      3
18 123453  1158       1      4
19 123453  1161       1      5

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2021-11-01
  • 2018-04-15
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多