【发布时间】:2016-11-10 20:20:42
【问题描述】:
我有以下示例数据:
data <- data.table(ID = c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4),
date = c(1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6),
score = c(4,3,2,2,4,1,5,5,5,2,1,4,2,1,5,5,5,3,5,5,5,2,4,5))
ID date score
1: 1 1 4
2: 1 2 3
3: 1 3 2
4: 1 4 2
5: 1 5 4
6: 1 6 1
7: 2 1 5
8: 2 2 5
9: 2 3 5
10: 2 4 2
11: 2 5 1
12: 2 6 4
13: 3 1 2
14: 3 2 1
15: 3 3 5
16: 3 4 5
17: 3 5 5
18: 3 6 3
19: 4 1 5
20: 4 2 5
21: 4 3 5
22: 4 4 2
23: 4 5 4
24: 4 6 5
ID date score
我想删除某些行并更改其他行,部分基于它们在表格中的位置。我有两个标准,每个ID:
如果一行有
date == 1和score == 5,我想删除该行以及紧跟在该行之后的所有后续行以及score==5的所有后续行,直到score不是5。(所以,例如,对于I == 4,我想保留日期 4、5、6) 的数据。对于
score == 5的所有其他日期,我想用他们前两个分数的平均值替换他们的分数(或者只是他们之前的分数,如果他们只有一个之前的分数)。
所以,我想最终得到的表格是:
ID date score
1: 1 1 4.0
2: 1 2 3.0
3: 1 3 2.0
4: 1 4 2.0
5: 1 5 4.0
6: 1 6 1.0
7: 2 4 2.0
8: 2 5 1.0
9: 2 6 4.0
10: 3 1 2.0
11: 3 2 1.0
12: 3 3 1.5
13: 3 4 1.5
14: 3 5 1.5
15: 3 6 3.0
16: 4 4 2.0
17: 4 5 4.0
18: 4 6 3.0
解决此问题的最佳方法是什么?我想这是shift 和.I 的某种组合,但我无法将它们组合在一起。
【问题讨论】:
-
对于第一部分,你可以做
data[, if(date[1L] == 1L) .SD[which.max(score != 5L):.N], by = ID]也许
标签: r data.table