我最近使用了以下问题中的代码在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)
虽然代码有效地处理了不同组之间的最小值没有联系的情况,但我遇到了多个物种共享相同最小值的问题。目前,实现仅根据第一个最小值来确定顺序的优先级,而不考虑其他标准。
在这种情况下,我想确保为第二个值较低的物种分配较低的排名顺序。我正在寻求有关如何修改代码的建议,以将第二个最小值视为对物种进行排序的决定因素。
您可以将数据帧传递给排名函数,例如
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