2016-05-06 6 views
0

Diese meine Daten (man stelle ich habe 1050 Zeilen von Daten weiter unten)Benötigen Sie Hilfe Auswertungsstatistiken für R-Datenrahmen immer

ID_one ID_two parameterX 
111  aaa  23 
222  bbb  54 
444  ccc  39 

Mein Code dann die Zeilen in Gruppen von 100 wird unterteilen (es wird 10 sein Gruppen von 100 Zeilen).

Ich möchte dann die zusammenfassende Statistik pro Gruppe erhalten. (funktioniert nicht) Danach möchte ich die Zusammenfassung Statistiken in einem Datenrahmen platzieren, um sie zu plotten.

Zum Beispiel setzen alle 10 Mittel zum parameterX in einem Datenrahmen zusammen, setzen alle 10 std dev für parameterX in demselben Datenrahmen zusammen etc Der folgende Code funktioniert nicht:

#assume data is available 
dataframe_size <- nrow(thedata) 
group_size <- 100 
number_ofgroups <- round(dataframe_size/group_size) 

#splitdata into groups of 100 
split_dataframe_into_groups <- function(x,y) 
    0:(x-1) %% y 
list1 <- split(thedata, split_dataframe_into_groups(nrow(thedata), group_size)) 

#print data in the first group 
list1[[1]]$parameterX 

#NOT WORKING!!! #get summary stat for all 10 groups 
# how to loop through all 10 groups? 
list1_stat <- do.call(data.frame, list(mean = apply(list1[[1]]$parameterX, 2, mean), 
    sd = apply(list1[[1]]$parameterX, 2, sd). . .)) 

der Fehler Nachricht ist immer:

Fehler gelten (...) dim (x) eine positive Länge haben müssen , die keinen Sinn macht, denn wenn ich diesen Code ausführen, gibt eindeutig eine positive Länge (Daten vorhanden)

#print data in the first group 
list1[[1]]$parameterX 

    #how to put all means in a dataframe? 
    # how to put all standard deviations in the same dataframe 
    ex df1 <- mean(2,2,3,4,7,2,4,,9,8,9), 
      sd (0.1, 3 , 0.5, . . .) 
+0

Funktioniert dies für Ihren Code: 't (sapply (list1, Funktion (x) c (Mittelwert = Mittelwert (x $ ParameterX), SD = SD (x $ ParameterX))))'? – Raad

+0

Erstellen Sie die Gruppen basierend auf der Zeilennummer oder basierend auf ID1 oder ID2? –

+0

es basiert auf Zeilennummer. Ex-Zeilen 1-100 sind in Gruppe 1, Zeilen 101-201 werden in Gruppe 2 usw. –

Antwort

0

dplyr für diese Art der Sache so gut ist. Wenn Sie eine neue Spalte erstellen, die basierend auf der Position der Zeile eine Gruppen-ID zuweist, können Sie jede Gruppe sehr einfach zusammenfassen. Ich verwende einen Index, um bei der Zuweisung von Gruppen-IDs zu helfen.

install.packages('dplyr') 
library(dplyr) 

## Create index 
df$index <- 1:nrow(df) 

## Assign group labels 
df$group <- paste("Group", substr(df$index, 1, 1), sep = " ") 
df[df$index <= 100, 'group'] <- "Group 0" 
df[df$index > 1000, 'group'] <- paste("Group", substr(df$index, 1, 2), sep = " ") 
df[df$index > 10000, 'group'] <- paste("Group", substr(df$index, 1, 3), sep = " ") 

## Get summaries  
df <- group_by(df, group) 
summaries <- summarise(df, avg = mean(parameterX), 
minimum = min(parameterX), 
maximum = max(parameterX), 
med = median(parameterX), 
Mode = mode(parameterX)) 

... und so weiter.

Hoffe, das hilft.

+0

Sorry, ich habe es herausgefunden, bevor Sie das eintippten, dumme ich !! es scheint zu funktionieren !, Aber was sind die 100 und 1000? Wie kann ich Parameter anstelle von Hardcoding verwenden?Thx –

+0

Ich habe versucht, Parameter zu verwenden, und es gab mir einen Fehler df [df $ index <= group_size, 'group'] <- "Gruppe 0" df [df $ index> Anzahl der Gruppen, 'Gruppe'] <- "Gruppe 10 " –

+0

Die Art, wie ich' substr() 'benutzt habe, macht es so, dass du etwas weniger als 100 oder mehr als 1000 kodieren musst. Ansonsten sind deine Gruppierungen deaktiviert. Gruppe 1 wird alles von 0-200 und über 1000 haben. Wenn Sie es mehr parametrisieren wollen, bin ich sicher, dass Sie eine for-Schleife mit substr() entwerfen können, die es ziemlich einfach macht. Was war der Fehler, den du bekommen hast? Wenn diese Antwort auch für Sie funktioniert, drücken Sie die Schaltfläche zum Hochladen, und wenn es wirklich für Sie funktioniert, klicken Sie auf das entsprechende Häkchen. :) –

0

Ich denke, das könnte ein guter Ort sein, um Tapply zu verwenden. Es gibt eine ausgezeichnete Zusammenfassung here! Ein Weg nach vorn könnte eine Erweiterung der unten sein:

df <- data.frame(id= c(rep("AA",10),rep("BB",10)), x=runif(20)) 
do.call("rbind", tapply(df$x, df$id, summary)) 
0

Ich denke, das ist das, was Sie wollen:

require(dplyr) 
dt<-rbind(iris,iris,iris) 
dataframe_size <- nrow(dt) 
group_size <- 100 
number_ofgroups <- round(dataframe_size/group_size) 
df<-dt %>% 
# Creating the "bins" column using mutate 
mutate(bins=cut(seq(1:dataframe_size),breaks=number_ofgroups)) %>% 
# Aggregating the summary statistics by the bins variable 
group_by(bins) %>% 
# Calculating the mean 
summarise(mean.Sepal.Length = mean(Sepal.Length)) 


head(dt) 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   5.1   3.5   1.4   0.2 setosa 
2   4.9   3.0   1.4   0.2 setosa 
3   4.7   3.2   1.3   0.2 setosa 
4   4.6   3.1   1.5   0.2 setosa 
5   5.0   3.6   1.4   0.2 setosa 
6   5.4   3.9   1.7   0.4 setosa 

df 

    bins mean.Sepal.Length 
    (fctr)    (dbl) 
1 (0.551,113]   5.597345 
2 (113,226]   5.755357 
3 (226,338]   5.919643 
4 (338,450]   6.100885 
+0

Würdest du die Antwort klären können? Danke Was ist das: group_by (bins)%>% zusammenfassen (mean.Sepal.Length = mean (Sepal.Length))? und dt <-bind (iris, iris, iris) und was ist das: df <-dt %>% muate (bins = cut (seq (1: dataframe_size), breaks = anzahl der gruppen))%>% –

+0

'rbind (iris, iris, iris) 'ist nur ein Datensatz mit genügend Zeilen zu erstellen, so dass das Binning von 100 Zeilen sinnvoll ist. Der Ansatz verwendet dplyr, das in der Lesbarkeit sehr ähnlich zu SQL ist. Sie können mehr unter: https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html –

+0

es lief aber wie kann ich diesen Code für meine Zwecke verwenden? Ich brauche Mittelwert, Standardabweichung usw. Ich sollte die Mutate-Funktion verwenden? Danke –