2017-10-04 7 views
-1

J'ai donc l'ensemble des données suivantes (ce qui est un petit échantillon/exemple de quoi il ressemble, avec les lignes et 30 colonnes étant 7k originales de plus de 7 ans):Comment utiliser résumé et grouper par pour créer un tableau récapitulatif dans r?

Year,Location,Population Total, Median Age, Household Total 
2000, Adak, 220, 45, 67 
2000, Akiachak, 567, NA, 98 
2000, Rainfall, 2, NA, 11 
1990, Adak, NA, 33, 56 
1990, Akiachak, 456, NA, 446 
1990, Tioga, 446, NA, NA 

Je veux créer un résumé tableau qui indique le nombre d'années de données disponibles par emplacement pour chaque variable. Donc, quelque chose comme ça fonctionnerait (pour le petit exemple d'avant):

Location,Population Total, Median Age, Household Total 
Adak,1,2,2 
Akiachak,2,0,2 
Rainfall,1,0,1 
Tioga,1,0,0 

Je suis nouveau à R et n'ont pas utilisé ces deux commandes ensemble, donc je ne suis pas sûr de la syntaxe. Toute aide serait merveilleuse ou alternative.

+0

Vous devez utiliser le package 'dplyr'. Commencez par 'group_by (Location)', puis écrivez votre déclaration 'summarise' ou' count'. Je suggère de regarder dans un tutoriel sur l'utilisation de 'dplyr' cependant. –

+0

En outre, vous recevrez un bien meilleur retour sur les questions ici si vous fournissez un exemple d'approches que vous avez essayées. Tel quel, certains pourraient interpréter cela comme une question de devoirs ... –

+0

Merci! Je pense à changer tout ce qui n'est pas NA à 1, Na à 0 et ensuite agréger les lignes tout en emportant les années. Mais mon patron dit que je devrais essayer d'utiliser ces deux fonctions ensemble. – jules

Répondre

1

Une solution avec summarize_all de dplyr:

library(dplyr) 
df %>% 
    group_by(Location) %>% 
    summarize_all(funs(sum(!is.na(.)))) %>% 
    select(-Year) 

Ou vous pouvez utiliser summarize_at:

df %>% 
    group_by(Location) %>% 
    summarize_at(vars(-Year), funs(sum(!is.na(.)))) 

Résultat:

# A tibble: 4 x 4 
    Location PopulationTotal MedianAge HouseholdTotal 
     <chr>   <int>  <int>   <int> 
1  Adak    1   2    2 
2 Akiachak    2   0    2 
3 Rainfall    1   0    1 
4  Tioga    1   0    0 

données:

df = read.table(text = "Year,Location,PopulationTotal, MedianAge, HouseholdTotal 
       2000, Adak, 220, 45, 67 
       2000, Akiachak, 567, NA, 98 
       2000, Rainfall, 2, NA, 11 
       1990, Adak, NA, 33, 56 
       1990, Akiachak, 456, NA, 446 
       1990, Tioga, 446, NA, NA", header = TRUE, sep = ",", stringsAsFactors = FALSE) 

library(dplyr)  
df = df %>% 
    mutate_at(vars(PopulationTotal:HouseholdTotal), as.numeric) 
1

Vous pouvez faire quelque chose comme ceci:

x %>% 
    group_by(Location) %>% 
    summarise(count_years = n(), 
      count_pop_total = sum(!is.na(Population_Total)), 
      count_median_age = sum(!is.na(Median_Age)), 
      count_house_total = sum(!is.na(Household_Total))) 

où vous pouvez remplacer la moyenne avec ce que l'opération que vous souhaitez effectuer. Vous devriez jeter un oeil à la dplyr vignette pour des solutions plus générales.

+0

vous avez raison. J'ai mal lu la question – tbradley

+0

J'ai changé ma réponse pour donner ce que OP voulait utiliser explicitement 'group_by' et' summarise', cependant, la réponse donnée par @useR avec 'summarize_all' ou' summarize_at' est probablement meilleure pour cette situation – tbradley