在r中如何对多个数字列中的最低数值按组进行排序?

问题描述 投票:0回答:1

在 R 中,我有一个包含物种列表的数据框,每个数据框都有两个带有数值的相关列(overall.percentage 和 min.range)。对于每个物种,都有多个品系(代表不同的种群)。 这是数据框的示例:

species<- data.frame(species= c("dog", "dog", "dog", "cat", "cat", "fish", "fish"),
                 overall.percentage = c(12, 13, 19,  20, 12,  10, 50),
                 min.range= c(19, 19, 99,  1, 2,  44, 26))

我想创建一个新列,根据每个物种在 2 个数字列中的任意一个中的最低值对所有物种(而不是种群)进行排序。

以上数据的结果将是:

species<- data.frame(species= c("dog", "dog", "dog", "cat", "cat", "fish", "fish"),
                 overall.percentage = c(12, 13, 19,  20, 12,  10, 50),
                 min.range= c(19, 19, 99,  1, 2,  44, 26),
 order = (3, 3, 3, 1, 1, 2, 2))

(解释:“猫”在“顺序”中具有“1”,因为它在总体百分比和最小范围中具有最低值(即“1”)在所有其他物种中。鱼有“2”因为它具有第二低的值“10”,而“狗”具有“3”,因为它具有较低的值 12)。

我想我需要: (1)按物种对数据框进行分组(使用聚合函数?) (2) 选择物种内的最低值(同时考虑两个数字列) (3) 然后创建一个新的数字列,根据每个物种在所有物种中的顺序为每个物种编号。 最终目标是使用这个新的“顺序”列按升序对物种进行排序,以进行 ggplotling。

我设法使用聚合函数仅根据一个参数(而不是同时根据两个参数)找到每个物种内的最小值: 最少按物种 <- aggregate ((overall.percentage) ~ species.English.name, data = species, min)

此外,我不清楚如何创建稍后将用于 ggploting 的“order”列。

r sorting aggregate
1个回答
0
投票

这是使用

ave()
实现所需结果的一种选择:

species <- data.frame(
  species = c("dog", "dog", "dog", "cat", "cat", "fish", "fish"),
  overall.percentage = c(12, 13, 19, 20, 12, 10, 50),
  min.range = c(19, 19, 99, 1, 2, 44, 26)
)

species |>
  transform(
    value = ave(
      pmin(overall.percentage, min.range), species,
      FUN = min
    )
  ) |>
  transform(
    order = as.numeric(
      reorder(species, value)
    )
  ) |> 
  subset(select = -value)
#>   species overall.percentage min.range order
#> 1     dog                 12        19     3
#> 2     dog                 13        19     3
#> 3     dog                 19        99     3
#> 4     cat                 20         1     1
#> 5     cat                 12         2     1
#> 6    fish                 10        44     2
#> 7    fish                 50        26     2
© www.soinside.com 2019 - 2024. All rights reserved.