【问题标题】:Binning data by row values with minimum sample size以最小样本量按行值对数据进行分箱
【发布时间】:2016-08-06 01:08:56
【问题描述】:

我试图弄清楚如何创建具有最小样本量的箱,该箱还考虑了特定列中的值。

因此,在下面的虚拟数据中,我想创建其中至少包含 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 的行,这不是什么大不了的事,但这就是因为它有点乱。

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

【问题讨论】:

    标签: r loops for-loop binning


    【解决方案1】:

    这是该问题的递归解决方案,其中get_6 将根据列a 返回一个组变量。在get_i函数里面满足条件,从索引6开始往前走,直到找到下一个不等于当前值且唯一值长度不等于1的索引,每次我们找到了一个满足条件的序列,我们将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
    

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 2020-05-28
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      相关资源
      最近更新 更多