Mes données actuelles:
Type Country Score University Australia 10 University Brazil 10 University Hong Kong 10 College Australia 10 College Brazil 10 College Hong Kong 10 All Australia 20 All Brazil 20 All Honk Kong 20
Maintenant, je souhaite avoir un résumé des nouvelles lignes créées à partir des données ci-dessus, comme indiqué ci-dessous. Les nouvelles lignes sont une somme des scores de chaque université et collège d'un pays.
Type Country Score University Australia 10 University Brazil 10 University Hong Kong 10 College Australia 10 College Brazil 10 College Hong Kong 10
Je sais que je peux écrire une boucle pour parcourir les données et vérifier les pays, mais peut-être que je peux utiliser des packages comme dplyr
pour réaliser ce que je veux.
3 Réponses :
Nous devons group_by
'Country' obtenir la somme
de 'Score', créer une nouvelle colonne 'Type' avec "All" et lier les lignes avec les données d'origine
library(dplyr) df1 %>% group_by(Country) %>% summarise(Score = sum(Score)) %>% mutate(Type = "All") %>% bind_rows(df1, .) # Type Country Score #1 University Australia 10 #2 University Brazil 10 #3 University Hong Kong 10 #4 College Australia 10 #5 College Brazil 10 #6 College Hong Kong 10 #7 All Australia 20 #8 All Brazil 20 #9 All Hong Kong 20
votre solution fonctionne, mais avez-vous eu un avertissement comme "facteur de liaison et vecteur de caractère, contraignant en vecteur de caractère"
@fanbondi, l'avertissement est juste pour vous rappeler que bind_rows ()
convertira automatiquement la variable combinée en caractère lors de la liaison des facteurs et des caractères. Cela n'a pas d'importance dans ce cas.
Ou dans la base R, vous pouvez le faire avec aggregate
Extra = cbind("All", aggregate(df$Score, list(df$Country), sum)) names(Extra) = names(df) rbind(df, Extra) Type Country Score 1 University Australia 10 2 University Brazil 10 3 University Hong Kong 10 4 College Australia 10 5 College Brazil 10 6 College Hong Kong 10 7 All Australia 20 8 All Brazil 20 9 All Hong Kong 20
Une autre méthode avec ave()
:
df2 <- within(df1, {Type <- "All" ; Score <- ave(Score, Country, FUN = sum)}) rbind(df1, unique(df2)) # Type Country Score # 1 University Australia 10 # 2 University Brazil 10 # 3 University Hong Kong 10 # 4 College Australia 10 # 5 College Brazil 10 # 6 College Hong Kong 10 # 7 All Australia 20 # 8 All Brazil 20 # 9 All Hong Kong 20
Selon la description, vous aurez peut-être besoin de
df1%>% group_by (Col1, Col2)%>% summary (col3 = sum (col3))%>% ungroup%>% mutate (Col1 = 'All')% >% bind_rows (df1,.)
Salut, s'il vous plaît voir la modification. La question initiale n'était pas très claire.