Если вы хотите изучить tidyverse
, вы можете сделать что-то вроде этого. Я попытался скопировать c ваш фрейм данных, но добавил еще несколько строк.
Вы начинаете с data> group_by Genre> order> выбираете топ 5
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'), 120, replace = TRUE)
)
Data %>%
group_by(Genre ) %>%
arrange(desc(listen)) %>%
select(listen) %>%
top_n(5) %>%
arrange(Genre)
#> Adding missing grouping variables: `Genre`
#> Selecting by listen
#> # A tibble: 15 x 2
#> # Groups: Genre [3]
#> Genre listen
#> <chr> <chr>
#> 1 Pop 05:47
#> 2 Pop 05:47
#> 3 Pop 05:43
#> 4 Pop 05:41
#> 5 Pop 05:28
#> 6 RnB 05:54
#> 7 RnB 05:44
#> 8 RnB 05:43
#> 9 RnB 05:29
#> 10 RnB 05:28
#> 11 Rock 05:54
#> 12 Rock 05:44
#> 13 Rock 05:41
#> 14 Rock 05:29
#> 15 Rock 05:26
Извините, если я неправильно понял то, что вы хотели. Если вы назначите код новому data.frame и сделаете anti_join исходному DF, а затем измените Genre на others , это должно быть то, что вы хотите - я думаю.
df <- Data %>%
group_by(Genre ) %>%
arrange(desc(listen)) %>%
select(listen) %>%
top_n(5) %>%
arrange(Genre)
# make an anti_join and assign 'other' to Genre
anti_join(Data, df) %>%
mutate(Genre = 'others')
Следующее редактирование
Надеюсь, теперь я понял ваш вопрос. Вам нужно просто подсчитать, как часто жанры встречаются в ваших данных, и дать тем, которые не входят в топ-15, имя Другие . Может быть, меня ввел в заблуждение предложенный вами фрейм данных, в котором показаны только 3 жанра. Итак, я поискал в Википедию и добавил несколько, придумал несколько собственных жанров и использовал БУКВЫ для создания DF с достаточным количеством жанров.
С count(Genre)
жанры встречаются. посчитали, а затем расположили в порядке убывания. Затем я ввел новый столбец с номерами строк. Вы можете удалить это, если хотите, так как он нужен только для следующего шага, который вводит другой столбец - я решил создать новый столбец вместо переименования всех имен в Genre - с name Top15 , присваивая каждому жанру, который находится на месте (в строке) 16 или более поздних, имя Others и оставляя остальные без изменений.
head(20)
просто печатает первые 20 рядов этого DF.
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
Надеюсь, это было то, что вы искали