我正在尝试弄清楚如何创建具有最小样本量的容器,该容器也考虑特定列中的值。
因此,在下面的虚拟数据中,我想创建其中包含最少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的行,这不是一个大问题,但那是因为它有点混乱。
我不会以任何方式依附于这个循环,如果有一个更简单的方法来回答这个问题,我会全力以赴!
答案 0 :(得分:1)
以下是问题的递归解决方案,其中get_6
将根据列a
返回组变量。在get_i
函数里面满足条件,从索引6
开始向前移动,直到找到下一个不等于当前值的索引,并且唯一值的长度不等于{{ 1}},每当我们找到满足条件的序列时,我们将1
增加1,结果将类似于id
函数从rleid
得到的结果,在那里,可以根据这个组变量计算摘要统计数据:
data.table