根据 ID 将数据折叠到单行

Collapsing data to a single row based on ID

我正在尝试根据 ID 将我的数据折叠成一行。数据由 ID(站点位置)和在每个站点(SP1、SP2 等)中发现的物种数量组成。目前它们有多个 ID,具体取决于在该站点上发现了多少个物种,我想折叠数据,所以我只有一行基于站点 ID。

我的数据目前看起来与此类似:

my_data <- data.frame(ID = c(1,2,3,3,3,4,4,4,4),
                      SP1 = c(10,15,0,0,0,0,0,0,10),
                      SP2 = c(0,0,5,0,0,8,0,0,0),
                      SP3 = c(0,0,0,20,0,0,4,0,0),
                      SP4 = c(0,0,0,0,0,0,0,12,0),
                      SP5 = c(0,0,0,0,6,0,0,0,0))

我想让它看起来像这样:

my_data2 <- data.frame(ID = c(1,2,3,4),
                       SP1 = c(10,15,0,10),
                       SP2 = c(0,0,5,8),
                       SP3 = c(0,0,20,4),
                       SP4 = c(0,0,0,12),
                       SP5 = c(0,0,6,0))

我认为最好的方法是遵循下面的代码行,但不确定要在摘要中包含什么

my_data %>%
        group_by(ID)
        summarise()

从您的描述中不清楚您要计算哪种类型的摘要。 summax 或其他可能会产生您想要的结果。也就是说,以下将起作用。我在这里使用 sum,但您可以轻松地替换为另一个函数:

library(tidyverse)

my_data2 <- my_data %>% 
  group_by(ID) %>% 
  summarize(
    across(everything(), sum)
  )

# A tibble: 4 × 6
     ID   SP1   SP2   SP3   SP4   SP5
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1    10     0     0     0     0
2     2    15     0     0     0     0
3     3     0     5    20     0     6
4     4    10     8     4    12     0