2017-08-14 4 views
0
library(tidyverse) 

Je pense qu'il existe une solution simple pour cela, mais je suis coincé. Le code ci-dessous crée une simple liste de deux dataframes (ils sont les mêmes pour la simplicité de l'exemple, mais les données réelles a des valeurs différentes)Calculer la colonne de pourcentage pour la liste des données lorsque la valeur totale est masquée dans les lignes

Loc<-c("Montreal","Toronto","Vancouver","Quebec","Ottawa","Hamilton","Total") 
Count<-c("2344","2322","122","45","4544","44","9421") 

Data<-data_frame(Loc,Count) 
Data2<-data_frame(Loc,Count) 
Data3<-list(Data,Data2) 

Chaque dataframe a « Total » dans la colonne « Loc » avec le total global correspondant de la colonne "Count". Je voudrais calculer des pourcentages pour chaque trame de données en divisant chaque valeur dans la colonne "Comptage" par le total, qui est le dernier nombre dans la colonne "Comptage".

Je souhaite que les pourcentages soient ajoutés en tant que nouvelles colonnes pour chaque trame de données.

Pour cet exemple, le total est le dernier nombre de la colonne, mais en réalité, il peut être mélangé n'importe où dans la colonne et peut être trouvé par la valeur "Total" correspondante dans la colonne "Loc".

Je voudrais utiliser purrr et Tidyverse:

Voici un exemple du code, mais je suis bloqué sur le pourcentage ...

Data3%>%map(~mutate(.x,paste0(round(100* (MISSING PERCENTAGE),2),"%")) 

Répondre

0

Cette solution utilise la base-R uniquement :

for (i in seq_along(Data3)) { 
    Data3[[i]]$Count <- as.numeric(Data3[[i]]$Count) 
    n <- nrow(Data3[[i]]) 
    Data3[[i]]$perc <- Data3[[i]]$Count/Data3[[i]]$Count[n] 
} 

> Data3 
[[1]] 
# A tibble: 7 x 3 
     Loc Count  perc 
     <chr> <dbl>  <dbl> 
1 Montreal 2344 0.248805859 
2 Toronto 2322 0.246470651 
3 Vancouver 122 0.012949793 
4 Quebec 45 0.004776563 
5 Ottawa 4544 0.482326717 
6 Hamilton 44 0.004670417 
7  Total 9421 1.000000000 

[[2]] 
# A tibble: 7 x 3 
     Loc Count  perc 
     <chr> <dbl>  <dbl> 
1 Montreal 2344 0.248805859 
2 Toronto 2322 0.246470651 
3 Vancouver 122 0.012949793 
4 Quebec 45 0.004776563 
5 Ottawa 4544 0.482326717 
6 Hamilton 44 0.004670417 
7  Total 9421 1.000000000 
+0

Merci, mais êtes-vous en mesure de fournir une réponse qui n'utilise pas une boucle for? (Applique la famille de fonctions). Ou encore mieux, une solution Tidyverse qui utilise des tuyaux (%>%)? Je demande seulement parce que cette question fait en fait partie d'un plus gros morceau de code qui est principalement dans la syntaxe de Tidyverse et qui utilise des tuyaux si soudainement passer à une boucle for me fera changer le flux. J'espère que vous pouvez aider? – Mike

+0

pas très familier avec Tidyverse ... peut-être peut-être regarder dans quelques jours si personne n'a fourni une réponse satisfaisante – snoram

+0

Pas de problème. Êtes-vous capable de réécrire en utilisant lapply (ou un groupe de fonctions similaire) à la place de la boucle for? – Mike