我有一个相当大的data.frame
,显示了对一系列树种进行两次处理(加上对照)的数据分析结果。我希望能够创建一个新data.frame
,显示每个物种的对照和每种处理之间的差异。
这里有一些虚拟数据来显示我正在尝试做什么
dat <- data.frame(species = rep (c("Oak", "Elm", "Ash"), each = 3),
result = c(10, 7, 4, 13, 9, 2, 8, 5, 1),
treatment = rep(c('Ctrl', 'Type_1', 'Type_2')))
species result treatment
1 Oak 10 Ctrl
2 Oak 7 Type_1
3 Oak 4 Type_2
4 Elm 13 Ctrl
5 Elm 9 Type_1
6 Elm 2 Type_2
7 Ash 8 Ctrl
8 Ash 5 Type_1
9 Ash 1 Type_2
我想做的是通过各自的对照减去每个物种的Type_1
和Type_2
处理结果,并生成包含结果的新data.frame
。它应该看起来像这样。
species result treatment_diff
1 Oak 3 Type_1
2 Oak 6 Type_2
3 Elm 4 Type_1
4 Elm 11 Type_2
5 Ash 3 Type_1
6 Ash 7 Type_2
乐于采取dplyr
、tidyr
、datatable
或任何其他解决方案
非常感谢
一个选项可能是使用group_by
并使用每个组的first
值来提取和filter
结果为 0 的行,如下所示:
dat <- data.frame(species = rep (c("Oak", "Elm", "Ash"), each = 3),
result = c(10, 7, 4, 13, 9, 2, 8, 5, 1),
treatment = rep(c('Ctrl', 'Type_1', 'Type_2')))
library(dplyr)
dat %>%
group_by(species) %>%
mutate(result = first(result) - result) %>%
filter(result != 0)
#> # A tibble: 6 × 3
#> # Groups: species [3]
#> species result treatment
#> <chr> <dbl> <chr>
#> 1 Oak 3 Type_1
#> 2 Oak 6 Type_2
#> 3 Elm 4 Type_1
#> 4 Elm 11 Type_2
#> 5 Ash 3 Type_1
#> 6 Ash 7 Type_2
创建于 2022-07-29 由 reprex 软件包 (v2.0.1)