r - 选择第一个观察到的数据并利用 mutate

标签 r dplyr

我的数据遇到问题,我想获取第一个观察到的 ob评分 score每个人id并从最后观察到的 score 中减去它.

要求第一个观察减去最后一个观察的问题是有时第一个观察数据丢失。

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

我构建了下面的 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

我希望运行的是能给我带来...
   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

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

最佳答案

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

首先,我会确保您的 score 列是一个具有适当 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))

那么你可以做
library(dplyr)
help %>% group_by(id) %>% arrange(ob) %>% 
    mutate(es=first(na.omit(score)-last(na.omit(score))))

关于r - 选择第一个观察到的数据并利用 mutate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30787047/

相关文章:

r - 使用sparklyr::spark_read_json时添加文件名

当库函数使用非标准求值时重构 R 代码

r - 为什么此 dplyr() 分组代码在 base R 中有效,但在 Shiny 中运行时却无效?

使用 dplyr 计算多列的行中位数

r - 将列表合并并熔化到数据框

r - data.table 无法识别过滤器中的逻辑

r - 如何从数据框中检索与其他列的最大值相对应的列中的值

r - 当列名是年份时减去列

r - R中列表中的向量与多个向量之间的匹配

r - 计算 R 中的小计