如何按组统计以逗号分隔的条目总数

问题描述 投票:0回答:3

我正在使用英雄联盟冠军数据集

名字 标签
亚托克斯 战士
阿狸 法师、刺客
阿卡丽 刺客
阿克尚 射手、刺客
阿利斯塔 坦克、支援

我想知道如何计算每个标签的冠军总数,我对 R 非常陌生,所以我做了一个我认为非常糟糕的解决方案,我知道这可能是一个可以帮助解决这个问题的函数。

首先,我将标签分成不同的列

library(tidyverse)
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

最后我将所有内容放在一起并添加了

library(janitor)
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)

我想知道是否有更好的方法来做到这一点,或者是否有一个函数可以处理这种情况。

r dataframe dplyr count grouping
3个回答
0
投票

您可以使用

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

0
投票

A

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

创建于 2024-07-25,使用 reprex v2.1.0


0
投票

也许你只想要这句话

> 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)
© www.soinside.com 2019 - 2024. All rights reserved.