在r中按组选择第二大行

cdmah0mi  于 2023-02-14  发布在  其他
关注(0)|答案(4)|浏览(165)

我有个问题

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,我只想保留var 1值第二大的行。我尝试了不同的方法(dplyr,base R):

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

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

第一个代码没有;t work,第二个代码给出错误的答案。
我哪里做错了?

cyvaqqii

cyvaqqii1#

problem |> group_by(id) %>% arrange(var1) %>% slice(n()-1)

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

fnx2tebb

fnx2tebb2#

如果你希望使用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 == max(var1[var1 != max(var1)]))

输出

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

3htmauhk3#

如果您有卷,这里是一个data.table方法。

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))
setDT(problem)
setorder(problem, id, - var1)
problem[, .SD[2], by=id]

至于@paul斯塔福德艾伦的评论,你会对只有1人的团队有意见。

bprjcwpo

bprjcwpo4#

arrangedesc上执行"var1"结束后,将slice2一起使用

library(dplyr)
problem %>% 
   arrange(id, desc(var1)) %>%
   group_by(id) %>%
   slice(2) %>% 
   ungroup
  • 输出
# A tibble: 2 × 3
     id  var1  var2
  <dbl> <dbl> <dbl>
1     1     4    12
2     2     5     9

相关问题