Я работаю с набором данных League of Legends Champions.
И мне было интересно, как подсчитать общее количество чемпионов по тегу, я действительно новичок в R, поэтому я нашел решение, которое, по моему мнению, очень плохое, и я знаю, что это может быть функция, которая может помочь в этом.
Вот пакеты, которые я использую
library(tidyverse)
library(janitor)
Сначала я разделяю теги по разным столбцам.
lol_champions_tags <- lol_champions_clean %>%
select(name, tags) %>%
separate(tags, sep = ',', into = paste0('tag', 1:2))
Затем я рассчитываю общее количество записей по тегу.
lol_champions_tags %>%
select(name, tag1) %>%
group_by(tag1) %>%
summarise(N = n()) -> tag1
lol_champions_tags %>%
select(name, tag2) %>%
drop_na() %>%
group_by(tag2) %>%
summarise(N = n()) -> tag2
И наконец я собрал все воедино и сделал дополнение
champions_per_tag <-
bind_cols(tag1, tag2) %>%
clean_names() %>%
select(tag1,n_2,n_4) %>%
mutate(total_entries = n_2 + n_4) %>%
select(tag1, total_entries)
Мне было интересно, есть ли лучший способ сделать это или есть функция, которая могла бы справиться с ситуацией такого типа.
Может быть, вам нужна именно эта однострочная фраза
> as.data.frame(table(unlist(strsplit(lol_champs$tags, ",", fixed=TRUE))))
Var1 Freq
1 Assassin 3
2 Fighter 1
3 Mage 1
4 Marksman 1
5 Support 1
6 Tank 1
Последний раздел кода кажется непонятным, поэтому я не копирую его.
lol_champs = read.table(text = "name tags
Aatrox Fighter
Ahri Mage,Assassin
Akali Assassin
Akshan Marksman,Assassin
Alistar Tank,Support", header=TRUE)
Вы можете сделать это довольно легко с помощью функций tidyverse
. Используйте stringr::str_split
, чтобы разделить столбец тегов на список отдельных слов, затем unnest
и count
...
lol_champs %>% mutate(tags = str_split(tags, ",")) %>%
unnest_longer(tags) %>%
count(tags)
# A tibble: 6 × 2
tags n
<chr> <int>
1 Assassin 3
2 Fighter 1
3 Mage 1
4 Marksman 1
5 Support 1
6 Tank 1
separate_longer_delim
?
Однострочник tidyverse
:
# PKGs (dplyr, tidyr) -----------------------------------------------------
library(tidyverse)
# Toy data ----------------------------------------------------------------
lol_data <- tibble::tribble(
~name, ~tags,
"Aatrox", "Fighter",
"Ahri", "Mage,Assassin",
"Akali", "Assassin",
"Akshan", "Marksman,Assassin",
"Alistar", "Tank,Support")
# Code (just `separate_rows` and `count` it) ------------------------------
lol_champs <- count(separate_rows(lol_data, tags, sep = ",\\s?"), tags, name = "total_entries")
# Output ------------------------------------------------------------------
lol_champs
#> # A tibble: 6 × 2
#> tags total_entries
#> <chr> <int>
#> 1 Assassin 3
#> 2 Fighter 1
#> 3 Mage 1
#> 4 Marksman 1
#> 5 Support 1
#> 6 Tank 1
Created on 2024-07-25 with reprex v2.1.0
Почему бы просто не separate
дольше с разделителем, а потом count
?
library(dplyr)
library(tidyr)
lol_champs |>
separate_longer_delim(cols = tags, delim = ",") |>
count(tags)
tags n
1 Assassin 3
2 Fighter 1
3 Mage 1
4 Marksman 1
5 Support 1
6 Tank 1
Вы можете использовать scan
+ table
+ stack
, как показано ниже.
> stack(table(scan(text = df$tags, what = "", sep = ",")))
Read 8 items
values ind
1 3 Assassin
2 1 Fighter
3 1 Mage
4 1 Marksman
5 1 Support
6 1 Tank
Исправьте последний раздел кода и отобразите желаемый результат.