2017-02-20 4 views
-1

Comment générer des statistiques récapitulatives (moyenne, sd, plage, taille d'échantillon) pour plusieurs catégories (différentes mesures dans la rangée 1) de différentes espèces (dans la colonne 1) simultanément et les faire imprimer à l'aide de .csv() à un fichier de données Je peux le faire assez facilement si je le fais une espèce à la fois mais je voudrais placer toutes les données de toutes les espèces dans un fichier .csv générer les statistiques de somme tout à la fois. "Statistiques sommaires dans R

+4

Bienvenue dans StackOverflow! S'il vous plaît ayez une lecture rapide de [comment demander] (http://stackoverflow.com/help/how-to-ask) et vérifiez [comment faire un exemple reproductible] (http://stackoverflow.com/questions/ 5963269/comment-faire-un-grand-r-reproductible-exemple). Ensuite, vous pouvez revenir et modifier votre question, en ajoutant un exemple et du code pour montrer ce que vous avez essayé et tout ce qui vous aide à clarifier votre question. – Jota

Répondre

1

Je sais de quoi vous parlez. Supposons que vous souhaitiez obtenir la moyenne, l'écart type, la plage et la taille de l'échantillon. Parce que R donne la plage de fonctions qui ne vous donne pas de nombre mais le plus petit nombre de virgules le plus petit dans l'ensemble de données, cela me pose un problème. La magie est en tapply(). J'ai juste utilisé transpose t() et as.matrix pour le rendre plus facile à mettre dans un cadre de données.

De toute façon, jetez un oeil à l'ensemble de données iris intégré.

data(iris) 

Je vais vous donner la moyenne, sd, et la taille de l'échantillon pour tous ceux-ci par rapport à sépales Longueur seulement, écrire toutes les valeurs aux lignes d'une trame de données avec rbind, puis enfin donner les noms des lignes avec noms de famille().

Il suffit de faire ceci:

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

Merci beaucoup. Je peux obtenir toutes ces données séparément pour chaque espèce, mais quand je veux ces données pour plusieurs espèces dans la même matrice de données (fichier .csv), je voudrais les faire toutes à la fois plutôt que de découper la matrice en espèces individuelles spécifiques matrices de données à exécuter séparément. Y a-t-il un script pour ça? –

0

Je pensais à ma réponse que je donnais dans la journée, et je pensais que cela aurait pu être mieux quand je réalisais que la fonction tapply peut accepter la variable INDEX comme une liste. Dans mon exemple, j'étais seulement conscient que tapply pourrait classer un facteur mais nous pouvons spécifier plusieurs facteurs. L'astuce consiste à faire fondre l'iris dataframe de large en forme longue qui le rend plus lisible en utilisant la matière fondue de fonction(), puis tapply avec un argument de liste:

 > 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 

Ici, nous allons obtenir les dimensions de fleurs moyenne de tous les facteurs de l'iris: longueur des sépales, largeur des sépales, longueur des pétales, & Largeur des pétales chez toutes les espèces (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 

Si nous changeons l'ordre des facteurs dans la liste INDEXED, nous pouvons obtenir les mêmes informations qui nous est présenté dans un format légèrement de différence en feuilletant les lignes et les colonnes:

> 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 

Obtenir la écart-type est facile. Il suffit de changer l'argument FUN:

> 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 

Maintenant, je n'ai pas besoin d'utiliser Rbind fondamentalement.