2015-12-13 2 views
2

J'ai une trame de données complexe et un exemple minimal est la suivante:rowsum sur une table imbriquée dans r

df <- structure(list(District = c("Adilabad", "Adilabad", "Adilabad", 
         "Adilabad", "Adilabad", "Adilabad", "Adilabad", "Adilabad", "Adilabad", 
         "Adilabad"), Subdistt = c("Adilabad", "Adilabad", "Adilabad", 
         "Tamsi", "Tamsi", "Tamsi", "Tamsi", "Tamsi", "Tamsi", "Tamsi" 
         ), TRU = c("Total", "Rural", "Urban", "Total", "Rural", "Urban", 
         "Rural", "Rural", "Urban", "Urban"), Level = c("District", "District", 
         "District", "Sub-District", "Sub-District", "Sub-District", "Village", 
         "Village", "Town", "Town"), No_HH = c(1277, 364, 913, 
         1277, 364, 913, 117, 247, 614, 299)), .Names = c("District", 
         "Subdistt", "TRU", "Level", "No_HH"), row.names = c(NA, 10L), class = "data.frame") 

qui ressemble à ceci:

District Subdistt TRU  Level No_HH 
1 Adilabad Adilabad Total  District 1277 
2 Adilabad Adilabad Rural  District 364 
3 Adilabad Adilabad Urban  District 913 
4 Adilabad Tamsi Total Sub-District 1277 
5 Adilabad Tamsi Rural Sub-District 364 
6 Adilabad Tamsi Urban Sub-District 913 
7 Adilabad Tamsi Rural  Village 117 
8 Adilabad Tamsi Rural  Village 247 
9 Adilabad Tamsi Urban   Town 614 
10 Adilabad Tamsi Urban   Town 299 

Chaque colonne suivante d'une manière est une sorte de sous-ensemble de la colonne précédente. Je dois valider si la somme du sous-district et du district au niveau rural, urbain et total. Par exemple: La somme des lignes 7 et 8 est égale à la valeur de la ligne 5. La ligne 5 est un sous-district rural. Comme nous étendons la DF, j'ai beaucoup de sous-districts ruraux. La somme de tous les sous-districts ruraux est donnée dans le district rural, qui est rangée 2.

Une sortie attendue minimale sera comme suit:

District Subdistt TRU  Level No_HH 
1 Adilabad Tamsi Rural Sub-District 364 
2 Adilabad Tamsi Urban Sub-District 913 

364 est une somme de 117 + 247 donné l'exemple minimal ci-dessus et 913 est la somme de la somme des lignes 614 + 299 donnée dans l'exemple minimal.

Actuellement, je suis en mesure de sous-ensemble à une valeur particulière, mais je ne sais pas comment faire une somme basée sur ces sélections complexes. Quelqu'un peut-il aider?

+0

Pouvez-vous montrer la sortie attendue? – akrun

+0

Essayez-vous de trouver 'library (dplyr); df%>% filtre (TRU! = 'Total')%>% group_by _ (. Points = noms (df) [1: 2])%>% summary (No_HH = sum (No_HH)) ' – akrun

+0

@akrun la sortie attendue est la valeur des lignes 1 à 6, où la ligne 5 sera la somme de 7 & 8 et la ligne 5 sera la somme des lignes 9 & 10, la ligne 4 sera la somme des lignes 5 & ​​6. La valeur de la ligne 1 sera similaire à la somme des lignes ayant une colonne Total dans TRU et Sub-District dans Level. – LeArNr

Répondre

1

Nous pouvons essayer

library(dplyr) 
df %>% 
    filter(Level=='Sub-District' & TRU != 'Total') 
# District Subdistt TRU  Level No_HH 
#1 Adilabad Tamsi Rural Sub-District 364 
#2 Adilabad Tamsi Urban Sub-District 913 

Si nous avons besoin pour obtenir le même résultat par sum ming,

df %>% 
    filter(!grepl('District', Level)) %>% 
    group_by(District, Subdistt,TRU) %>% 
    summarise(No_HH= sum(No_HH)) %>% 
    mutate(Level= 'Sub_District') 
# District Subdistt TRU No_HH  Level 
#  (chr) (chr) (chr) (dbl)  (chr) 
# 1 Adilabad Tamsi Rural 364 Sub_District 
# 2 Adilabad Tamsi Urban 913 Sub_District 
+1

beaucoup de mercis! C'est fabuleux !! – LeArNr