选择第一个观察到的数据并使用mutate

b22*_*222 5 r dplyr

我遇到了我的数据问题,我希望对每个人进行第一次观察ob得分并从最后观察到的数据中减去.scoreidscore

要求第一次观察减去最后一次观察的问题是有时缺少第一次观察数据.

无论如何要求每个人的第一个观察得分,从而跳过任何缺失的数据?

我构建了下面的df来说明我的问题.

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20),
                   ob = c(1,2,3,4,5,1,2,3,1,2,1,2,3),
                   score = c(NA, 2, 3, 4, 3, 7, 3, 4, 3, 4, NA, 1, 4))

   id ob score
1   5  1    NA
2   5  2     2
3   5  3     3
4   5  4     4
5   5  5     3
6  12  1     7
7  12  2     3
8  12  3     4
9  17  1     3
10 17  2     4
11 20  1    NA
12 20  2     1
13 20  3     4
Run Code Online (Sandbox Code Playgroud)

而我希望运行的代码将给我......

   id ob score  es
1   5  1    NA  -1
2   5  2     2  -1
3   5  3     3  -1
4   5  4     4  -1
5   5  5     3  -1
6  12  1     7   3
7  12  2     3   3
8  12  3     4   3
9  17  1     3  -1
10 17  2     4  -1
11 20  1    NA  -3
12 20  2     1  -3
13 20  3     4  -3
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用dplyr并且我理解使用'group_by'命令,但是,不确定如何'选择'仅首先观察到的分数然后变异来创建es.

MrF*_*ick 6

我会使用first()last()(两个dplyr函数)和na.omit()(来自默认的stats包.

首先,我会确保您的分数列是具有正确NA值的数字列(不是示例中的字符串)

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20),
       ob = c(1,2,3,4,5,1,2,3,1,2,1,2,3),
       score = c(NA, 2, 3, 4, 3, 7, 3, 4, 3, 4, NA, 1, 4))
Run Code Online (Sandbox Code Playgroud)

那么你可以做到

library(dplyr)
help %>% group_by(id) %>% arrange(ob) %>% 
    mutate(es=first(na.omit(score)-last(na.omit(score))))
Run Code Online (Sandbox Code Playgroud)