J'ai un jeu de données en format large que je veux transformer au format long. Les colonnes du grand format désignent deux niveaux d'une variable de format long. Je souhaite la moyenne de la moyenne sur chaque ensemble de colonnes dans le format large, et représente cette valeur (la moyenne), pour chaque ensemble de colonnes, dans une table de format long résumée.
Disons que j'ai des données d'une étude qui testait comment les vétérinaires pesaient des animaux. Il y a 10 vétérinaires (ce sont les "sujets"), un dans chaque rangée. Quant aux animaux pesés, il y a des chiens ou des chats (dont 6 types). Chaque vétérinaire mesurait tous les animaux dans un cadre de clinique ou une maison. Je veux calculer, pour chaque vétérinaire, un poids moyen de (1) tous les chiens qu'il a mesurés, et (2) poids moyen de tous les chats qu'il a mesuré. P> J'ai créé deux données de données séparées, chacune pour un ensemble d'animaux différent, où je calcule la moyenne pour les colonnes pertinentes. Ensuite, j'ai fusionné les tables. P> Alors oui, j'ai pu obtenir le résultat que je voulais, mais je suis mécontent de cette solution, car c'est un code répétitif, et serait une douleur si je n'ai plus que 2 séries de colonnes à transformer. Y a-t-il un moyen plus concis d'obtenir le même résultat? Je sais que je peux toujours écrire une fonction pour être exécutée x fois, mais je me demandais s'il y a une solution plus élégante, je ne suis pas au courant de, en particulier en utilisant Tidyverse Code>. P> P>
3 Réponses :
library(tidyverse) df %>% # reshape into longer format pivot_longer(-c(id, location), names_to = "col", values_to = "wt") %>% # separate header into "animal" and "name" columns separate(col, c("animal", "name")) %>% # take the average weight for each id/location/animal combo group_by(id, location, animal) %>% summarise(mean_wt = mean(wt)) # A tibble: 20 x 4 # Groups: id, location [10] id location animal mean_wt <int> <dbl> <chr> <dbl> 1 1 0 cat 19.7 2 1 0 dog 18.3 3 2 1 cat 21.7 4 2 1 dog 15.5 5 3 0 cat 15.3 6 3 0 dog 18.5 7 4 0 cat 18 8 4 0 dog 18.7 9 5 0 cat 18.7 10 5 0 dog 19.5 11 6 1 cat 17.3 12 6 1 dog 18.8 13 7 1 cat 17.7 14 7 1 dog 17 15 8 0 cat 16.8 16 8 0 dog 20.3 17 9 0 cat 14.8 18 9 0 dog 19.7 19 10 0 cat 19.3 20 10 0 dog 15.5
# A tibble: 20 x 4 # Groups: id, location [10] id location animal mean_wt <int> <dbl> <chr> <dbl> 1 1 0 cat 19.7 2 1 0 dog 18.3 3 2 1 cat 21.7 4 2 1 dog 15.5 5 3 0 cat 15.3 6 3 0 dog 18.5 7 4 0 cat 18 8 4 0 dog 18.7 9 5 0 cat 18.7 10 5 0 dog 19.5 11 6 1 cat 17.3 12 6 1 dog 18.8 13 7 1 cat 17.7 14 7 1 dog 17 15 8 0 cat 16.8 16 8 0 dog 20.3 17 9 0 cat 14.8 18 9 0 dog 19.7 19 10 0 cat 19.3 20 10 0 dog 15.5
Pour l'assurance complet, un datable.table code> solution
Ces moyennes doivent-elles correspondre aux mêmes données que votre exemple ici? Les chats pour ID1 LOC0 additionnent jusqu'à 118 lb ou 19,7 avg.
Oh Snap. Je définis
RowMeans code> pour sélectionner des colonnes contenant les mots "CAT", donc il considérait également le lo chat b> ion i> colonne ...