0
votes

Comment changer toutes les valeurs Attendez-vous pour les valeurs supérieures (par fréquence) à partir d'une variable catégorique dans R

J'ai une trame de données dans R qui ressemble à celle qui ressemble à celle ci-dessous, avec la variable de facteur "Genre": xxx

Je veux laisser les 15 genres (par comptage) comme ils sont et seulement renommer tous les autres genres qui sont pas parmi les 15 premiers. Ceux devraient être renommés dans le mot "Autre".

En d'autres termes - si, par exemple, le genre "RNB" n'est pas parmi les 15 genres top 15, il devrait être remplacé par le mot "Autre".

Le tableau que je voudrais Toujours être ressemblant à ceci alors: xxx

Comment puis-je aborder cela? Merci!


0 commentaires

5 Réponses :


0
votes

Essayez de remplacer df code> avec votre data.frame.frame code> Pour vérifier si vous obtenez la sortie souhaitée: xxx pré> blockquote>

> head(df[pos, ])  # The original data, without the top 15 Genres
   Genre ListeningTime
2      n      4.151121
4      z      4.529619
5      h      4.043982
7      s      3.521054
16     w      3.528091
18     h      4.588815


2 commentaires

Salut @Trusky! Merci pour votre réponse rapide! La sortie que je recherche est la même table que dans mon exemple ci-dessus. La différence que je cherche, je veux que je veux des genres écoutées très rarement (pas parmi les 15 genres les plus écoutés) soit regroupée dans "Autre".


Je viens de mettre à jour la sortie imprimée sur la réponse, essayez-la. Je pense que cela fait ce dont vous avez besoin.



1
votes

Si vous voulez regarder dans Tidyverse Code> Vous pouvez faire quelque chose comme ça. J'ai essayé d'imiter votre cadre de données, mais j'ai ajouté quelques lignes supplémentaires.

Vous commencez par Data> Group_by Genre> Commande> Chose Top 5 P>

library(tidyverse)

set.seed(1)
Data <- data.frame(
  listen = format(as.POSIXlt(paste0(
      as.character(sample(1:5)),
      ':',
      as.character(sample(0:59))), format = '%H:%M'),format = '%H:%M'),
  Genre = sample(c("Rock", "Pop", 'RnB', 'Opera',
                   'Birthday Songs', 'HipHop',
                   'Chinese Songs', 'Napoli Lovesongs',
                   'Benga', 'Bongo', 'Kawito', 'Noise',
                   'County Blues','Mambo', 'Reggae',
                   LETTERS[0:24]), 300, replace = TRUE)
)

Data %>% count(Genre) %>% 
  arrange(desc(n)) %>% 
  mutate(place = row_number()) %>% 
  mutate(Top15 = ifelse(place > 15, 'Others', Genre)) %>% 
  head(20)
#> # A tibble: 20 x 4
#>    Genre            n place Top15       
#>    <chr>        <int> <int> <chr>       
#>  1 N               15     1 N           
#>  2 T               13     2 T           
#>  3 V               13     3 V           
#>  4 K               12     4 K           
#>  5 Rock            11     5 Rock        
#>  6 X               11     6 X           
#>  7 E               10     7 E           
#>  8 W               10     8 W           
#>  9 Benga            9     9 Benga       
#> 10 County Blues     9    10 County Blues
#> 11 G                9    11 G           
#> 12 J                9    12 J           
#> 13 M                9    13 M           
#> 14 Reggae           9    14 Reggae      
#> 15 B                8    15 B           
#> 16 D                8    16 Others      
#> 17 I                8    17 Others      
#> 18 P                8    18 Others      
#> 19 R                8    19 Others      
#> 20 S                8    20 Others


4 commentaires

Hey @marblo, merci! Si je comprends bien, le code ci-dessus sélectionne uniquement les valeurs figurant parmi les meilleurs 5. Toutefois, est une façon de dire que toutes les autres valeurs doivent être renommées "Autres"?


J'ai aussi mis à jour ma réponse. Changements après la ligne horizontale.


Hey @marblo, si je comprends bien, votre fonction organise la table en "temps d'écoute" - le plus long temps d'écoute le plus long sur le haut, le plus bas sur le fond. Cependant, ce que je cherche, c'est un arrangement par compte / fréquence, ce qui signifie que je souhaite avoir les 15 genres les plus grands par comptage / leur nombre de survenus dans les données (et renommer tous les autres).


@Lole_emily La prochaine mise à jour / modification de mon message est faite. J'espère que c'est maintenant ce que vous voulez.



0
votes
library(dplyr)

set.seed(123)
compute_listen_time <- function(n.songs) {
  min <- sample(1:15, n.songs, replace = TRUE)
  sec <- sample(0:59, n.songs, replace = TRUE)
  sec <- ifelse(sec > 10, sec, paste0("0", sec))
  paste0(min, ":", sec)
}



df <- data.frame(
  Genre = sample(c("Rock", "Pop", "RnB", "Rock", "Pop"), 100, replace = TRUE),
  Listen_Time = compute_listen_time(100)
)


df <- add_count(df, Genre, name = "count") %>%
  mutate(
    rank = dense_rank(desc(count)),
    group = ifelse(rank <= 15, Genre, "other")
  )
df


2 commentaires

Hey @eyayaw! Merci! Malheureusement, cette fonction suppose que les 15 dernières valeurs de la trame de données sont celles avec le nombre le plus élevé. Ce que j'ai reçu après avoir essayé la fonction était une table avec un seul genre et tous les autres renommés "Autres", puisque mon jeu de données est assez grand.


J'ai mis à jour ma réponse. Combien de genres de chansons que vous avez dans les données?



0
votes

Je peux penser à une solution de données.table. Supposons votre data.frame s'appelle musique code>, puis:

library(data.table)
setDT(music)

other_genres <- music[, .N, by = genre][order(-N)][16:.N, genre]

music[genre %chin% other_genres, genre := "other"]


0 commentaires

0
votes

Il y a une solution assez soignée avec le package FORCATS appliqué ici sur le jeu de données DIAMONDS Nommez uniquement le top 5 Clarity Valeurs et paquet Le reste comme "autre" xxx

résultat: xxx


0 commentaires