3
votes

Dataframe ajoute de nouvelles lignes à partir de celles existantes

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.


2 commentaires

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.


3 Réponses :


4
votes

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


2 commentaires

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.



3
votes

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


0 commentaires

1
votes

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


0 commentaires