0
votes

Grand au format long: comment moyenne sur des colonnes spécifiques (2 séries de colonnes)

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.

Données factices

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é. xxx H2> Ma solution Clunky actuelle

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. xxx

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 .


2 commentaires

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 pour sélectionner des colonnes contenant les mots "CAT", donc il considérait également le lo chat ion colonne ...


3 Réponses :


1
votes
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

0 commentaires

2
votes
# 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

0 commentaires

1
votes

Pour l'assurance complet, un datable.table solution xxx


0 commentaires