【发布时间】: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 <- df[order(df[,1], df[,2]),]
然后我将 Support 变量的累积总和计算到单独的列中
df$Dosage <- 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
【问题讨论】:
-
你能显示预期的输出吗
-
我添加了预期的输出。谢谢大家的帮助!