Tally()ing 整个数据框中的多个观察值

Tally()ing Multiple Observations In an Entire Data Frame

我在弄清楚如何处理包含多个我想统计的观察结果的列时遇到了问题。例如:

HTML/CSS;Java;Java脚本;Python;SQL

这是数据框一列的单元格之一,我想统计每种编程语言的出现次数。这是应该用 str_detect()、corpus() 解决的问题,还是有其他我没有看到的方法?

我的目标是制作这些语言中的每一种(HTML、CSS、Java、JavaScript、Python、SQL, etc...) 到列名中,记录它们在数据框的这一列中出现的次数。

我觉得我的措辞可能很奇怪,所以如果您需要任何说明,请告诉我。

如果我正确理解了你的问题,这就是解决方案:

library(dplyr)
library(tidyr)

# demo data
df <- dplyr::tibble(ID = c("Line 1: ","Line 2:"), 
                    PL = c("HTML/CSS;JavaScript;Python;SQL;R","R;HTML/CSS;Java;JavaScript;SQL;R"))

# calculations
df %>% 
  dplyr::mutate(PLANG = stringr::str_split(PL, ";")) %>% 
  tidyr::unnest(c(PLANG)) %>% 
  dplyr::group_by(ID, PLANG) %>% 
  dplyr::count() %>% 
  tidyr::pivot_wider(names_from = "PLANG", values_from = "n", values_fill = 0)

  ID         `HTML/CSS` JavaScript Python     R   SQL  Java
  <chr>           <int>      <int>  <int> <int> <int> <int>
1 "Line 1: "          1          1      1     1     1     0
2 "Line 2:"           1          1      0     2     1     1

如果你只想要每个标签的总数,你可以使用 unnest_longer 和分组 count:

# using @DPH's example data
library(dplyr)
library(tidyr)

df %>%
  mutate(across(PL, strsplit, ";")) %>%
  unnest_longer(PL) %>%
  group_by(PL) %>%
  count()

# A tibble: 6 x 2
# Groups:   PL [6]
  PL             n
  <chr>      <int>
1 HTML/CSS       2
2 Java           1
3 JavaScript     2
4 Python         1
5 R              3
6 SQL            2

tidyverse 中您可以使用 separate_rowscount

library(dplyr)
df %>% tidyr::separate_rows(PL, sep = ';') %>% count(PL)

在 base R 中,我们可以在 semi-colon 上拆分字符串并用 table 计数:

table(unlist(strsplit(df$PL, ';')))
#If you need a dataframe
#stack(table(unlist(strsplit(df$PL, ';'))))