R 根据值'过滤数据帧;中国的具体等级

R 根据值'过滤数据帧;中国的具体等级,r,R,这是问题的更新版本: 我有一个数据帧(df),例如 所需输出为 group value a 4.5 a 6.2 a 5.1 a 5.0 b 5.1 b 6.4 也就是说,x为每个组分配一个值 对于“a”组,分配2,并 对于组“b”,分配了3个 所需输出提取 每个“a组”4.2和4.2的最小2个“值”,以及 每个“b组”3.5、4.1和3.3的最小3个“值” 所需输出包括除与这些值相关的行之外的所有df行。我怎样才能用R

这是问题的更新版本:

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

所需输出为

group  value
a      4.5
a      6.2  
a      5.1
a      5.0
b      5.1
b      6.4
也就是说,x为每个组分配一个值

  • 对于“a”组,分配2,并
  • 对于组“b”,分配了3个
所需输出提取

  • 每个“a组”4.2和4.2的最小2个“值”,以及
  • 每个“b组”3.5、4.1和3.3的最小3个“值”
所需输出包括除与这些值相关的行之外的所有df行。我怎样才能用R做到这一点?我很高兴能得到任何帮助。非常感谢

你可以试试

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)
df2你可以试试

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)

df2这里有另一种可能的
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
df$indx唯一(y$x),])
#组值x indx
#a.2 a 4.5 2 3
#a.3 a 6.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

这里是另一种可能的
数据。表
方法,无需重新排序数据

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
df$indx唯一(y$x),])
#组值x indx
#a.2 a 4.5 2 3
#a.3 a 6.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

谢谢akrun,它工作得很好。再次非常感谢。谢谢阿克伦,效果很好。再次非常感谢。在devel版本中没有更快的
frank
函数吗?是的,我不想把它复杂化,因为它似乎没有必要。事实上,当我看到你的编辑……之前,我在这个问题上发表了这篇文章。在devel版本中没有更快的
frank
函数吗?是的,我不想把它复杂化,因为它似乎没有必要。事实上,当我看到你的编辑……之前,我在这个问题上发表了这篇文章。