从数据框中拉出顶行,条件为2列

时间:2017-11-06 13:52:15

标签: r

以下是我的数据

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

编辑: 我忘了提到我希望在将其分配给新数据集时能够在每个行中保留任何其他信息。例如,如果有另一列包含有关场位置的信息,我想保留它。此外,我想忽视关系,只要保留一个结果,它保持哪个结果并不重要。

2 个答案:

答案 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;

提供最低值(-1,因为1将是最高值)

编辑:

要忽视&#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,因为括号不适合变量名称。)