在R中,按组对多个数字列进行排序时如何优先考虑第二个最小值?

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

我最近使用了以下问题中的代码在r中如何对多个数字列中的最低数值进行排序并按组对R中的数据从组内的最小值到最大值进行排序。使用@stefan的答案:

species <- data.frame(
  species = c("dog", "dog", "cat", "cat", "fish", "fish"),
  overall.percentage = c(12, 13, 20, 12, 20, 50)
)


species <- species |>
  transform(
    value = ave(
      pmin(overall.percentage), species,
      FUN = min
    )
  ) |>
  transform(
    order = as.numeric(
      reorder(species, value)
    )
  ) |> 
  subset(select = -value)

虽然代码有效地处理了不同组之间的最小值没有联系的情况,但我遇到了多个物种共享相同最小值的问题。目前,实现仅根据第一个最小值来确定顺序的优先级,而不考虑其他标准。

在这种情况下,我想确保为第二个值较低的物种分配较低的排名顺序。我正在寻求有关如何修改代码的建议,以将第二个最小值视为对物种进行排序的决定因素。

r sorting aggregate
1个回答
0
投票

您可以将数据帧传递给排名函数,例如

row_number()
,以使用第二列来打破平局:

library(tidyverse)

species <- tibble(
  species = c("dog", "dog", "cat", "cat", "fish", "fish"),
  overall.percentage = c(12, 13, 20, 12, 20, 50)
)

species |> 
  mutate(
    rank = row_number(overall.percentage),
    .by = species
  ) |> 
  pivot_wider(
    names_from = rank,
    names_prefix = "min_",
    values_from = overall.percentage
  ) |> 
  mutate(rank = row_number(pick(min_1, min_2)))
#> # A tibble: 3 × 4
#>   species min_1 min_2  rank
#>   <chr>   <dbl> <dbl> <int>
#> 1 dog        12    13     1
#> 2 cat        12    20     2
#> 3 fish       20    50     3

创建于 2023-12-09,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.