2016-08-06 6 views
0

特定の列の値も考慮に入れた最小サンプルサイズのビンを作成する方法を理解しようとしています。最小サンプルサイズのロー値によるデータのバインド

したがって、以下のダミーデータでは、最小サンプル数6のビンを作成したいと思いますが、ビンに特定の値の列が含まれている場合は、同じ値を持つ他のすべての行。私はまた、どのビンにも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に1つの固有の値を持つ単一のビンを持たない方法を見つけます。たとえば、3番目のビンでは、6つの行にmean.a $ a = 7がありますが、次のシーケンシャルな行とその行の値を持つすべての行をそのビンに列aを追加したいと思います。この場合mean.a $ a = 8)。

また、1:数字を一番上に置かずにループを続ける方法を見つけられず、後でNAで行を削除するだけでは大したことではありませんが、それは一種の乱雑な理由です。

私はこのループには何も付いていません。この質問に答える簡単な方法があれば、私はそれだけです!

答えて

1

ここでは、get_6が列aに基づいてグループ変数を返す問題の再帰的な解決方法があります。条件は、6から始まるget_i関数内で満たされ、現在の値と等しくない次のインデックスが見つかるまで進み、一意の値の長さは1に等しくなく、

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 
+0

は、この加工さをありがとう:私たちは1でidを増やし、結果は要約統計量は、このグループの変数に基づいて計算することができ、そこから、あなたはdata.tableからrleid関数から得られるものと同様であろう条件すばらしいです! – tnl393

関連する問題