2017-02-20 3 views
-1

Wie erzeuge ich gleichzeitig Auswertungsstatistiken (Mittelwert, SD, Bereich, Stichprobenumfang) für mehrere Kategorien (unterschiedliche Messungen über Reihe 1) von verschiedenen Arten (in Spalte 1) gleichzeitig und lasse sie mit "schreiben" drucken .csv() zu einer Datendatei, ich kann das einfach machen, wenn ich eine Spezies gleichzeitig mache, aber ich würde gerne alle Daten aller Arten in einer .csv-Datei speichern und die Summenstatistik auf einmal erstellen. "Zusammenfassung Statistik in R

+4

Willkommen bei StackOverflow! Bitte lesen Sie kurz [wie man fragt] (http://stackoverflow.com/help/how-to-ask) und überprüfen Sie, wie Sie ein reproduzierbares Beispiel erstellen können (http://stackoverflow.com/questions/). 5963269/how-to-make-a-great-r-reproduzierbares Beispiel). Dann könnten Sie zurückkommen und Ihre Frage bearbeiten, indem Sie ein Beispiel und einen Code hinzufügen, um zu zeigen, was Sie versucht haben, und alles andere, was zur Klärung Ihrer Frage beiträgt. – Jota

Antwort

1

Ich weiß, wovon Sie sprechen. Angenommen, Sie möchten den Mittelwert, die Standardabweichung, den Bereich und die Stichprobengröße ermitteln. Da R den Funktionsbereich angibt, in dem Sie keine Zahl, sondern die kleinste Kommazahl im Dataset erhalten, gibt es ein Problem. Die Magie ist in tapply(). Ich habe einfach transpose t() und as.matrix verwendet, um das Einfügen in einen Datenrahmen zu erleichtern.

Wie auch immer, schauen Sie sich den eingebauten Iris-Datensatz an.

data(iris) 

Ich werde Ihnen den Mittelwert, SD und Stichprobengröße für alle diese in Bezug auf Sepal Länge nur geben, alle Werte auf Zeilen eine Datenrahmen mit rbind schreiben, und dann schließlich den Zeilen Namen geben, mit rownames().

tun Nur soviel:

mean_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, mean))) 
mean_sepal_length 

sd_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, FUN = sd))) 
sd_sepal_length 


sample_size_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, FUN = length))) 
sample_size_sepal_length 


df_sepal_length <- data.frame(mean_sepal_length) 
df_sepal_length 

View(df_sepal_length) 

df_sepal_length = rbind(df_sepal_length, sd_sepal_length) 

df_sepal_length = rbind(df_sepal_length, sample_size_sepal_length) 

rownames(df_sepal_length) <- c("Mean_sepal_length", "sd_sepal_length", "size_sepal_length") 

write.csv(df_sepal_length, "C:/Users/me/Documents/tapply_miracle.csv") 
+0

Vielen Dank. Ich kann all diese Daten für jede Art separat erhalten, aber wenn ich diese Daten für mehrere Arten in der gleichen Datenmatrix (.csv-Datei) haben möchte, würde ich sie alle gleichzeitig machen, anstatt die Matrix in einzelne Arten zu zerlegen Datenmatrizen, die separat ausgeführt werden. Gibt es dafür ein Skript? –

0

ich über meine Antwort zu denken, dass ich in dem Tag gab zurück, und ich dachte, dass es besser gewesen wäre, als ich erkennen, dass die tapply Funktion der Indexvariable akzeptieren als Liste. In meinem Beispiel war mir nur bewusst, dass tapply einen Faktor kategorisieren kann, aber wir können mehrere Faktoren angeben. Der Trick ist, die Iris Datenrahmen von breit in Langform zu schmelzen, die es besser lesbar mit der Funktion Schmelze() machen, und dann tapply mit einer Liste Argumente:

 > install.packages("reshape2") 
     > library(reshape2) 

    # I used melt to restyle the iris dataframe from wide to long turning the many columns into rows with less columns, and I coerced the iris dataset back to a dataframe. 

     > iris_melt <- data.frame(melt(data = iris, id = "Species", variable.name = "iris_factors", value.name = "iris_dimensions_cm")) 


    > head(iris_melt) 
    Species iris_factors iris_dimensions_cm 
1 setosa Sepal.Length    5.1 
2 setosa Sepal.Length    4.9 
3 setosa Sepal.Length    4.7 
4 setosa Sepal.Length    4.6 
5 setosa Sepal.Length    5.0 
6 setosa Sepal.Length    5.4 

Hier werden wir die mittlere Blume Abmessungen aller erhalten die Iris-Faktoren: Kelchblattlänge, Kelchblattbreite, Blütenblattlänge, & Blütenblattbreite über alle Arten (setosa, virginica, versicolor).

> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$Species, iris_melt$iris_factors), FUN = mean) 
      Sepal.Length Sepal.Width Petal.Length Petal.Width 
setosa   5.006  3.428  1.462  0.246 
versicolor  5.936  2.770  4.260  1.326 
virginica   6.588  2.974  5.552  2.026 

Wenn wir die Reihenfolge der Faktoren in der indexierten Liste zu ändern, können wir die gleichen Informationen, die uns präsentiert bekommen in einem leicht Unterschied Format durch die Zeilen Spiegeln und Spalten:

> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$iris_factors, iris_melt$Species), FUN = mean) 
      setosa versicolor virginica 
Sepal.Length 5.006  5.936  6.588 
Sepal.Width 3.428  2.770  2.974 
Petal.Length 1.462  4.260  5.552 
Petal.Width 0.246  1.326  2.026 

die Erste Standardabweichung ist einfach. Ändern Sie einfach das FUN Argument:

> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$iris_factors, iris_melt$Species), FUN = sd) 
       setosa versicolor virginica 
Sepal.Length 0.3524897 0.5161711 0.6358796 
Sepal.Width 0.3790644 0.3137983 0.3224966 
Petal.Length 0.1736640 0.4699110 0.5518947 
Petal.Width 0.1053856 0.1977527 0.2746501 

Jetzt muss ich Rbind im Grunde nicht verwenden.

Verwandte Themen