R中多个事件的变化百分比

时间:2018-10-17 00:06:39

标签: r dplyr

记录了一张珊瑚礁图片上的随机点。通过使用dplyr,我通过将某个点具有特定物种的次数除以总点数,得出物种(ID)的覆盖率。贝娄摘录了这些数据。

Event                ID    Percent
    2   Bryozoan         0.2222222
    2   Chlorophyta      0.2222222
    3   Chlorophyta      0.2222222
    1   Coralline Algae  1.3333333
    2   Coralline Algae  2
    3   Coralline Algae  1.7777778
    4   Coralline Algae  7.1111111
    2   Macroalgae       1.1111111

我正在尝试查找4个事件之间的百分比变化。因此,在我的珊瑚藻示例中,事件1到事件2的变化百分比将从1.333%增加到2%,

(2 / 1.33)* 100%= 150,

150-100 = 50%,因此增加50%。

然后,我需要对每个事件1到3、1到4、2到3等进行百分比变化。

我已经看到了使用lag()函数的类似问题,但是我不知道该如何在我的情况下使用它,因为在每种情况下都可能找不到物种(ID)。我应该如何处理R?将数据以宽格式放置会更容易吗? (如果有,将会更新)

1 个答案:

答案 0 :(得分:1)

您可以将表连接到自身上以产生所需的事件组合。我进行过滤以确保第二个事件号大于第一个事件号(如果它们相同,则更改为零;如果第二个事件号较小,则只是另一对的负数。)请注意,原始的第一个和最后一个行没有出现在这里,因为没有其他事件可以与它们进行比较。

library(tidyverse)
tbl <- read_table2(
"Event  ID  Percent
2   Bryozoan    0.2222222
2   Chlorophyta 0.2222222
3   Chlorophyta 0.2222222
1   CorallineAlgae 1.3333333
2   CorallineAlgae 2
3   CorallineAlgae 1.7777778
4   CorallineAlgae 7.1111111
2   Macroalgae  1.1111111"
)
tbl %>%
  arrange(ID, Event) %>%
  left_join(tbl, by = c("ID")) %>%
  filter(Event.y > Event.x) %>%
  mutate(Percent.change = (Percent.y / Percent.x) - 1) %>%
  select(ID, Event.x, Event.y, Percent.x, Percent.y, Percent.change)
#> # A tibble: 7 x 6
#>   ID             Event.x Event.y Percent.x Percent.y Percent.change
#>   <chr>            <int>   <int>     <dbl>     <dbl>          <dbl>
#> 1 Chlorophyta          2       3     0.222     0.222          0    
#> 2 CorallineAlgae       1       2     1.33      2              0.500
#> 3 CorallineAlgae       1       3     1.33      1.78           0.333
#> 4 CorallineAlgae       1       4     1.33      7.11           4.33 
#> 5 CorallineAlgae       2       3     2         1.78          -0.111
#> 6 CorallineAlgae       2       4     2         7.11           2.56 
#> 7 CorallineAlgae       3       4     1.78      7.11           3.00

reprex package(v0.2.0)于2018-10-16创建。