根据值的特定排名过滤数据框

时间:2015-02-22 15:01:16

标签: r

这是问题的更新版本:

Filtering a data frame according to values rank

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

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

所需的输出是

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

即,x为每个组分配一个值。

  • 对于小组" a",2已分配
  • for group" b"分配3

所需的输出提取

  • 每个"组a"的最小2"值" 4.2和4.2和
  • 每个"组b"的最小3"值" 3.5,4.1和3.3。

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

2 个答案:

答案 0 :(得分:3)

这是另一种可能的data.table方法,无需重新排序数据

library(data.table)
setDT(df)[, value[rank(value, ties.method = "first") > x[1L]], group]
#    group  V1
# 1:     a 4.5
# 2:     a 6.2
# 3:     a 5.1
# 4:     a 5.0
# 5:     b 5.1
# 6:     b 6.4

或某种类型的基础R方法

df$indx <- with(df, ave(value, group, FUN = rank, ties.method = "first"))
do.call(rbind, lapply(split(df, df$group), function(y) y[y$indx > unique(y$x), ]))
#      group value x indx
# a.2      a   4.5 2    3
# a.3      a   6.2 2    6
# a.7      a   5.1 2    5
# a.11     a   5.0 2    4
# b.4      b   5.1 3    4
# b.8      b   6.4 3    5

答案 1 :(得分:2)

你可以尝试

library(dplyr)
df1 %>% 
    group_by(group) %>% 
    arrange(value) %>% 
    slice(-(1:x[1]))%>%
    select(-x)
#    group value
#1     a   4.5
#2     a   5.0
#3     a   5.1
#4     a   6.2
#5     b   5.1
#6     b   6.4

或使用base R

 df2 <- df1[order(df1$group, df1$value),]
 indx <-  !!with(df2, ave(x, x, FUN=function(x) c(rep(0,x[1]), 
                         rep(1, length(x)-x[1]))))
 subset(df2, indx, select=-x)