【发布时间】:2021-07-04 21:33:22
【问题描述】:
我有一个包含 70 000 行的大型数据集,我想对其执行一些操作,但我找不到合适的解决方案。
bib sta run course finish comment day
1 42 9 1 SG 19.88 99 1
2 42 17 2 A 19.96 11 1
3 42 27 3 B 20.92 22 1
4 42 39 4 A 19.60 11 1
5 42 48 5 SG 20.24 99 1
6 42 61 6 C 22.90 33 1
7 42 76 7 B 20.70 22 1
8 42 86 8 C 22.74 33 1
9 42 93 9 C 22.75 33 1
10 42 103 10 A 19.79 11 1
11 42 114 11 B 20.67 22 1
12 42 120 12 SG 20.10 99 1
我想最终得到一个 tibble:
- 计算 SG 课程中每个号码布在某一天的平均完成时间。例如,19.88 + 20.24 + 20.10 / 3
- 通过从平均 SG 得分中减去完成来计算数据集中每个观察的差异得分。例如,19.88 - 平均值(SG)、19.96 - 平均值(SG)。
我尝试了以下方法:
- 第一组按天、围兜和课程。然后按 SG 过滤并计算均值:
avg.sgtime <- df %>%
group_by(day, bib, course) %>%
filter(course == 'SG') %>%
mutate(avg.sg = mean(finish))
导致以下小标题
bib sta run course finish comment day avg.sg
<int> <int> <int> <chr> <dbl> <int> <chr> <dbl>
1 42 9 1 SG 19.9 99 1 20.1
2 42 48 5 SG 20.2 99 1 20.1
3 42 120 12 SG 20.1 99 1 20.1
4 42 6 1 SG 20.0 99 2 19.9
5 42 42 5 SG 19.8 77 2 19.9
6 42 130 15 SG 19.9 99 2 19.9
7 42 6 1 SG 20.6 99 3 20.5
8 42 68 12 SG 20.6 77 3 20.5
9 42 90 15 SG 20.4 77 3 20.5
最后我使用以下语法将两个小标题连接在一起:
df %>% full_join(avg.sgtime) %>%
mutate(diff = finish - avg.sg)
但是,这不起作用。它仅适用于 SG 课程,但不适用于课程 A、B 和 C。有没有办法解决这个问题或有更好的解决方案?
bib sta run course finish comment day avg.sg diff
1 42 9 1 SG 19.88 99 1 20.07333 -0.193333333
2 42 17 2 A 19.96 11 1 NA NA
3 42 27 3 B 20.92 22 1 NA NA
4 42 39 4 A 19.60 11 1 NA NA
5 42 48 5 SG 20.24 99 1 20.07333 0.166666667
【问题讨论】: