【问题标题】:Aggregate top 3 values of a numerical column聚合数值列的前 3 个值
【发布时间】:2021-01-29 21:06:16
【问题描述】:

我有一栏物种丰富度

  Pct_Cov Species Site Plot
1    2.25    AMLA AC      1
2    4.75   BECA4 AC      1
3    9.50    BEPA AC      1
4    7.00    BEPO AC      1
5    9.25    PIRU AC      1
6    2.25    PIRI AC      1

尾巴

tail(st.ov)
       Pct_Cov Species Site Plot
612207     8.0    QUGA ZI  527
612208     1.0   RHAR4 ZI   527
612209     0.5   ARTR2 ZI   527
612210     1.0    POFE ZI   527
612211     3.0   VICIA ZI   527
612212     0.5    ARLU ZI  527

这里有很多地块,确切地说是 12438。每个地块都有各种不同的物种等。我正在尝试编写一个函数来创建一个新列来计算优势物种的丰度/从属物种的丰度之比。

“优势”将是每个地块前 1/4 物种的总和。因此,如果一个地块有 20 个物种,它将是 4 个最丰富物种的丰度之和。

我很难解决这个问题,想知道是否有人有任何提示。了解这些物种是什么也会有所帮助,但这似乎很棘手。

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是另一个 tidyverse 选项。由于您的数据对于两个 Plots 中的每一个只有 6 行,因此我将使用“前 2”和“除前 2 之外的所有数据”,而不是“4”。它很容易修改。

    dat %>%
      group_by(Plot) %>%
      mutate(R = dense_rank(Pct_Cov)) %>%
      summarize(Ratio = sum(Pct_Cov[R %in% 1:2]) / sum(Pct_Cov[! R %in% 1:2]))
    # # A tibble: 2 x 2
    #    Plot Ratio
    #   <int> <dbl>
    # 1     1 0.359
    # 2   527 0.273
    

    这并不能防止具有少数独特物种的地块。为此,可以添加一些行计数逻辑:

    dat %>%
      group_by(Plot) %>%
      mutate(R = dense_rank(Pct_Cov)) %>%
      summarize(Ratio = if (n() > (2+2)) sum(Pct_Cov[R %in% 1:2]) / sum(Pct_Cov[! R %in% 1:2]) else NA_real_)
    

    如果您得到NA,则意味着Plot 的独特物种太少。

    此外,它不承认 3(我的“2”加一)具有相同 Pct_Cov 的可能性,这听起来不太可能,但会是一个会扭曲数学的极端情况。


    数据

    dat <- structure(list(Pct_Cov = c(2.25, 4.75, 9.5, 7, 9.25, 2.25, 8, 1, 0.5, 1, 3, 0.5), Species = c("AMLA", "BECA4", "BEPA", "BEPO", "PIRU", "PIRI", "QUGA", "RHAR4", "ARTR2", "POFE", "VICIA", "ARLU"), Site = c("AC", "AC", "AC", "AC", "AC", "AC", "ZI", "ZI", "ZI", "ZI", "ZI", "ZI"), Plot = c(1L, 1L, 1L, 1L, 1L, 1L, 527L, 527L, 527L, 527L, 527L, 527L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "612207", "612208", "612209", "612210", "612211", "612212"))
    

    【讨论】:

      【解决方案2】:

      我们可以使用count得到'plot'、'Species'、arrange by 'plot'和descend order of 'n'的频率计数,然后按'plot'分组,创建将前 3 个“n”值的 sum 除以其余值的 sum 并与原始数据连接

      library(dplyr)
      out <- df1 %>%
         count(plot, Species) %>%
         arrange(plot, desc(n)) %>%
         group_by(plot) %>%
         mutate(ratio = sum(n[1:3])/sum(n[-(1:3)])) %>%
         right_join(df1)
      

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多