按行样本分组数据,样本量最小

时间:2016-08-06 01:08:57

标签: r loops for-loop binning

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

因此,在下面的虚拟数据中,我想创建其中包含最少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,但是我想将下一个连续行和所有具有该行值的行添加到该bin中(这将是所有行在这种情况下,有一个mean.a $ a = 8)。

此外,我无法弄清楚如何让循环继续循环,而不是在顶部有1:数字,然后只是删除带有NA的行,这不是一个大问题,但那是因为它有点混乱。

我不会以任何方式依附于这个循环,如果有一个更简单的方法来回答这个问题,我会全力以赴!

1 个答案:

答案 0 :(得分:1)

以下是问题的递归解决方案,其中get_6将根据列a返回组变量。在get_i函数里面满足条件,从索引6开始向前移动,直到找到下一个不等于当前值的索引,并且唯一值的长度不等于{{ 1}},每当我们找到满足条件的序列时,我们将1增加1,结果将类似于id函数从rleid得到的结果,在那里,可以根据这个组变量计算摘要统计数据:

data.table