r - 计算长数据中行之间的差异

我的数据库

| 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.maxwhich.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/

相关文章:

python - 计算 pandas 数据框行中 Python 列表中元素的出现次数

r - 如何在R中自动使函数的结果成为同一函数的参数

awk - 如何使用 awk 从列表中获取特定列

javascript - 如何分隔字符串中的标签

r - 选择仅连续运行特定值的组

rust - 如何在 Rust 中为 Option 实现 From

r - 如何在 R 中生成向量的所有可能的连续 n 元组?

c# - 自定义授权过滤最小 API .Net 6

python - 如何处理在 FastAPI 中混淆的路径操作?

kotlin - 如何将 `throw` 放入辅助函数中但仍然具有空安全性?