根据值排名过滤数据帧

时间:2015-02-22 10:41:52

标签: r

我有一个数据框(df),例如

group  value
a      4.2
a      4.5
a      6.2
b      5.1
b      3.5
a      4.2
a      5.1
b      6.4
b      3.3
b      4.1
a      5.0 

所需的输出是

group  value
a      4.5
a      6.2  
a      5.1
a      5.0
b      5.1
b      6.4
b      4.1

即,期望的输出提取每个"组"的最小2"值。例如,

  • 4.2和4.2是组a和
  • 中最小的两个值
  • 3.5和3.3是b组的两个最小值。

所需的输出包括除这些值的相关行之外的所有df行。我怎么能用R做到这一点?我会很高兴得到任何帮助。非常感谢。

2 个答案:

答案 0 :(得分:4)

这是一个使用包data.table和部分排序的解决方案:

library(data.table)
setDT(DF)
DF[, sort(value, partial = 2)[1:2], by = group]
#   group  V1
#1:     a 4.2
#2:     a 4.2
#3:     b 3.3
#4:     b 3.5

DF[, sort(value, partial = 2)[-(1:2)], by = group]
#   group  V1
#1:     a 6.2
#2:     a 4.5
#3:     a 5.1
#4:     a 5.0
#5:     b 6.4
#6:     b 5.1
#7:     b 4.1

当然,可以使用分割 - 应用 - 组合类型操作的众多替代方案中的一种。

答案 1 :(得分:2)

使用dplyr

的选项
library(dplyr)
 df %>% 
   group_by(group) %>%
   arrange(value) %>%
   slice(-(1:2))

或者

 df %>%
   group_by(group) %>% 
   filter(rank(value, ties.method='max')>2)