R中的第二个最小值的Aggregate / Group_by

时间:2017-08-07 01:59:45

标签: r dataframe group-by

我使用group_by()中的dplyraggregate()函数来汇总R中的列。对于我目前的问题,我想按个人分组,但找到一列(Number)的第二低,另一列(Year)的最低。所以,如果我的数据是这样的:

Number     Individual     Year     Value
123        M. Smith       2010     234
435        M. Smith       2011     346
435        M. Smith       2012     356
524        M. Smith       2015     432
119        J. Jones       2010     345
119        J. Jones       2012     432
254        J. Jones       2013     453
876        J. Jones       2014     654

我希望它成为:

Number     Individual     Year     Value
435        M. Smith       2011     346
254        J. Jones       2013     453

谢谢。

2 个答案:

答案 0 :(得分:3)

我们可以使用dplyr包。 dt2是最终输出。我们的想法是过滤掉Number列中的最小值,然后按IndividualNumberYear排列数据框。最后,选择每个组的第一行。

# Load package
library(dplyr)

# Create example data frame
dt <- read.table(text = "Number     Individual     Year     Value
123        'M. Smith'       2010     234
                 435        'M. Smith'       2011     346
                 435        'M. Smith'       2012     356
                 524        'M. Smith'       2015     432
                 119        'J. Jones'       2010     345
                 119        'J. Jones'       2012     432
                 254        'J. Jones'       2013     453
                 876        'J. Jones'       2014     654",
                 header = TRUE, stringsAsFactors = FALSE)

# Process the data
dt2 <- dt %>%
  group_by(Individual) %>%
  filter(Number != min(Number)) %>%
  arrange(Individual, Number, Year) %>%
  slice(1)

答案 1 :(得分:1)

我们可以使用dplyr

library(dplyr)
df1 %>%
    group_by(Individual) %>%
    arrange(Individual, Number) %>%
    filter(Number != max(Number)) %>%
    slice(which.max(Number))
# A tibble: 2 x 4
# Groups:   Individual [2]
#  Number Individual  Year Value
#   <int>      <chr> <int> <int>
#1    254   J. Jones  2013   453
#2    435   M. Smith  2011   346