在 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”列。
这是使用
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