【问题标题】:select second largest row by group in r在 r 中按组选择第二大行
【发布时间】:2023-02-07 23:39:34
【问题描述】:

我有这个问题

library(dplyr)
problem = data.frame(id = c(1,1,1,2,2,2), var1 = c(5,4,3, 6,5,4), var2 = c(99,12,32,88,9,8))

对于每个 id,我只想保留具有 var1 的第二大值的行。我尝试了不同的方式(dplyr,base):

problem %>%
  group_by(id) %>%
  slice_tail(2, -var1)


problem[with(problem, ave(var1, id, FUN = function(x) x == tail(sort(x), 2)[1])), ]

第一个代码不起作用,第二个代码给出了错误的答案。

我究竟做错了什么?

【问题讨论】:

  • slice_tail 中没有排序,它只是使用行的顺序。

标签: r


【解决方案1】:
problem |> group_by(id) %>% arrange(var1) %>% slice(n()-1)

n() 计算每组中的行数。 slice(n()-1) 取第 n-1 个元素。请注意,这会导致少于 2 名成员的群组出现问题 - 您可能希望允许这样做。

【讨论】:

    【解决方案2】:

    如果你想使用slice,我想你可以先slice_max()最大的两行,然后slice_tail删除最大的行。

    library(dplyr)
    
    problem %>%
      group_by(id) %>%
      slice_max(var1, n = 2) %>% 
      slice_tail(n = 1)
    

    或者您可以使用单个filter

    problem %>% group_by(id) %>% filter(var1 == sort(var1)[[2]])
    

    输出

    # A tibble: 2 × 3
    # Groups:   id [2]
         id  var1  var2
      <dbl> <dbl> <dbl>
    1     1     4    12
    2     2     5     9
    

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2013-01-20
      • 2022-12-12
      • 2015-11-16
      • 1970-01-01
      相关资源
      最近更新 更多