按具有最小样本量的行值对数据进行分箱

Binning data by row values with minimum sample size

我正在尝试弄清楚如何创建具有最小样本量的 bin,该样本量也考虑了特定列中的值。

因此,在下面的虚拟数据中,我想创建至少包含 6 个样本的 bin,但是如果 bin 包含具有来自 a 列的特定值的行,我希望该 bin 也包括具有相同值的所有其他行。我也不希望任何 bin 仅包含 a 行中的 1 个唯一值。然后我希望输出有一行,a 列中的唯一值的平均值,b 列中所有值的平均值和样本大小的列。

 df<-data.frame(a=c(1,1,2,2,2,3,3,3,3,4,4,5,6,6,6,7,7,7,7,7,7,8,8,8,9,9,9,9,10,10,10),
           b=c(12,13,11,12,12,11,15,13,12,11,14,15,11,14,12,11,14,12,13,15,11,11,12,13,14,16,14,13,15,13,15))

我希望输出看起来像这样:

  mean.a   mean.b n
1    2.0 12.33333 9
2    5.0 12.83333 6
3    7.0 12.66667 6
4    8.5 13.28571 7

这是我目前拥有的:

x<-df
final<-NULL

for(i in 1:16){
  x1<-x[1:6,]
  x2<-x[-c(1:6),]
  x3<-rbind(x1, x2[x2$a==x1$a[6],])
  n<-nrow(x3)
  y<-mean(x3$b)
  z<-mean(unique(x3$a))
  f<-data.frame(mean.a=z, mean.b=y, n=n)
  final<-rbind(final,f)
  x<-x[-c(1:n),]
}
final<-final[complete.cases(final),]

我遇到的问题是我不知道如何在 a 列中没有一个具有唯一值的 bin。例如,在第三个 bin 中,所有 6 行都有 mean.a$a=7,但我想将下一个顺序行和列 a 中具有该行值的所有行添加到该 bin(这将是所有在这种情况下具有 mean.a$a=8 的行)。

此外,我不知道如何让循环在顶部没有 1:number 的情况下继续循环,然后只删除带有 NA 的行,这不是什么大问题,但这就是它有点乱的原因。

无论如何我都不喜欢这个循环,如果有更简单的方法来回答这个问题,我完全赞成!

这是该问题的递归解决方案,其中 get_6 将 return 一个基于列 a 的组变量。在get_i函数里面满足条件,从索引6开始往前走,直到找到下一个不等于当前值且唯一值长度不等于[=的索引15=],每次我们找到一个满足条件的序列时,我们将 id 加一,结果将类似于您从 data.tablerleid 函数中得到的结果,从在那里,可以根据这个组变量计算汇总统计数据:

get_6 <- function(vec, id = 1) {
    if(length(vec) < 6) NULL
    else {
        get_i <- function(x, i = 6) {
            if(length(x) == i) i
            else if(x[i + 1] != x[i] && length(unique(x[1:i])) != 1) i
            else get_i(x, i + 1)
        }
        ind <- get_i(vec)
        c(rep(id, ind), get_6(vec[-(1:ind)], id + 1))
    }
}

s <- get_6(df$a)
s
# [1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4

library(dplyr)
df[1:length(s), ] %>% 
                      mutate(g = s) %>% group_by(g) %>% 
                      summarize(n = n(), mean.a = mean(unique(a)), mean.b = mean(b))

#Source: local data frame [4 x 4]

#      g     n mean.a   mean.b
#  <dbl> <int>  <dbl>    <dbl>
#1     1     9    2.0 12.33333
#2     2     6    5.0 12.83333
#3     3     9    7.5 12.44444
#4     4     7    9.5 14.28571