2016-08-06 4 views
0

Ich versuche herauszufinden, wie Sie Bins mit einer minimalen Stichprobengröße erstellen, die auch Werte in einer bestimmten Spalte berücksichtigt.Klassifizieren von Daten nach Zeilenwerten mit der Mindeststichprobengröße

Also, in den Dummy-Daten unten, möchte ich Bins erstellen, die eine Mindestanzahl von 6 Proben in ihnen haben, aber wenn eine Bin eine Zeile mit einem bestimmten Wert aus Spalte a enthält, möchte ich auch diese bin enthalten alle anderen Zeilen mit demselben Wert. Ich will auch nicht, dass irgendwelche Behälter nur 1 einzigartigen Wert von Reihe a enthalten. Ich möchte dann, dass die Ausgabe eine Zeile mit einem Mittelwert der eindeutigen Werte in Spalte a, einem Mittelwert aller Werte in Spalte b und einer Spalte mit Stichprobengröße enthält.

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)) 

möchte ich die Ausgabe in etwa so aussehen:

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 

Dies ist, was ich bisher:

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),] 

Das Problem, das ich habe ist, kann ich nicht finde heraus, wie man in Spalte a keinen einzigen Behälter mit einem eindeutigen Wert hat. Im dritten Bin haben beispielsweise alle 6 Zeilen mean.a $ a = 7, aber ich möchte die nächste sequentielle Zeile und alle Zeilen mit diesem Zeilenwert in Spalte a zu diesem Bin hinzufügen (das wären alle Zeilen, die habe in diesem Fall einen Mittelwert von $ a = 8.

Auch ich kann nicht herausfinden, wie man die Schleife weiter durchschleifen ohne 1: Nummer an der Spitze, und dann nur die Zeilen mit NAs danach löschen, das ist keine große Sache, aber das ist der Grund, warum es irgendwie unordentlich ist.

Ich bin mit dieser Schleife keineswegs verbunden, und wenn es eine einfachere Möglichkeit gibt, diese Frage zu beantworten, bin ich dafür!

Antwort

1

Hier ist eine rekursive Lösung für das Problem, wobei get_6 eine Gruppenvariable basierend auf der Spalte a zurückgibt. Die Bedingungen sind erfüllt in get_i Funktion innerhalb, beginnend von Index 6 und vorwärts gehen, bis wir den nächsten Index finden, der nicht gleich dem aktuellen Wert ist und die Länge der eindeutigen Werte ist nicht gleich 1, jedes Mal, wenn wir eine Sequenz gefunden, die erfüllt die Bedingung wir die id um eins erhöht und das Ergebnis wird ähnlich sein, was Sie von der rleid Funktion von data.table erhalten von dort zusammenfassende Statistiken können auf der Grundlage dieser Gruppenvariable berechnet werden: Sie

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

danken, das funktionierte groß! – tnl393

Verwandte Themen