从 R 数据帧中的另一行中减去一行



我有一个相当大的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_1Type_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

乐于采取dplyrtidyrdatatable或任何其他解决方案

非常感谢

一个选项可能是使用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)

相关内容

  • 没有找到相关文章

最新更新