我的数据库
| ID | Time | Score |
|:---- |:------:| -----:|
| 1 | 1 | 105 |
| 1 | 2 | 155 |
| 1 | 3 | 100 |
| 2 | 1 | 105 |
| 2 | 2 | 150 |
| 2 | 3 | Na |
如何计算最后一个可用分数(最高时间)和第一个分数(最低时间)之间的差异? 到目前为止我的代码
DB = DB %>%
group_by(ID) %>%
dplyr::mutate (Diff_score = Score[max(Time, na.rm= T) - Score [min(Time, na.rm=T)]) %>%
ungroup()
最佳答案
我们可以修改代码以使用 which.max
和 which.min
获取 'Time' 的索引,并将其用于 'Score' 的子集以查找差异(为了删除 NA 案例,根据 NA 值创建索引“i1”)
library(dplyr)
DB %>%
na_if("Na") %>%
type.convert(as.is = TRUE) %>%
group_by(ID) %>%
mutate(i1 = complete.cases(Score),
Diff_score = Score[i1][which.max(Time[i1])] -
Score[i1][which.min(Time[i1])], i1 = NULL) %>%
ungroup
-输出
# A tibble: 6 × 4
ID Time Score Diff_score
<int> <int> <int> <int>
1 1 1 105 -5
2 1 2 155 -5
3 1 3 100 -5
4 2 1 105 45
5 2 2 150 45
6 2 3 NA 45
或者在将 'Time' 转换为 NA 后使用 range
,其中 'Score' 值为 NA,并在 range 中使用
用于子集化na.rm = TRUE
DB %>%
na_if("Na") %>%
type.convert(as.is = TRUE) %>%
group_by(ID) %>%
mutate(Diff_score = diff(Score[range(NA^is.na(Score) *Time,
na.rm = TRUE)])) %>%
ungroup
https://stackoverflow.com/questions/73196561/