以下是我的数据
Animal Age Weight
Cow 5 100
Pig 4 80
Pig 4 85
Sheep 2 60
Sheep 3 65
Sheep 3 75
数据按动物分类,然后按动物组内的年龄分类,然后按重量(增加)分类。
有没有办法对这些数据进行分组,以便每个动物组和年龄组只留下最轻的动物?这就是输出的结果:
Animal Age Weight
Cow 5 100
Pig 4 80
Sheep 2 60
Sheep 3 65
编辑: 我忘了提到我希望在将其分配给新数据集时能够在每个行中保留任何其他信息。例如,如果有另一列包含有关场位置的信息,我想保留它。此外,我想忽视关系,只要保留一个结果,它保持哪个结果并不重要。
答案 0 :(得分:1)
另一个dplyr食谱:
library(dplyr)
animals <- data.frame(Animal = c("Cow", "Pig", "Pig", 'Sheep', 'Sheep', 'Sheep'),
Age = c(5, 4, 4, 2, 3, 3),
Weight = c(100, 80, 85, 60, 65, 75))
animals %>% group_by(Animal, Age) %>% top_n(-1, Weight)
# A tibble: 4 x 3
# Groups: Animal, Age [4]
Animal Age Weight
<fctr> <dbl> <dbl>
1 Cow 5 100
2 Pig 4 80
3 Sheep 2 60
4 Sheep 3 65
top_n
是一个方便的函数,它允许您只保留任何给定列的较大(或较低)值的N行。
在此示例中,top_n(-1, Weight)
为变量&#34; Weight&#34;
编辑:
要忽视&#34; tie&#34;,只保留每组不止一个的最后一行:
animals %>%
group_by(Animal, Age) %>%
top_n(-1, Weight) %>%
filter(row_number() == n())
答案 1 :(得分:0)
您可以使用dplyr
...
library(dplyr)
df %>% group_by(Animal,Age) %>%
summarise(MinWeight=min(Weight))
Animal Age MinWeight
1 Cow 5 100
2 Pig 4 80
3 Sheep 2 60
4 Sheep 3 65
(我将变量Weight(kg)
的名称更改为Weight
,因为括号不适合变量名称。)