0

我无法弄清楚如何处理包含我想要统计的多个观察结果的列。例如:

HTML/CSS;Java;JavaScript;Python;SQL

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

我的目标是将这些语言(HTML、CSS、Java、JavaScript、Python、SQL 等)中的每一种都制成一个列名,并记录它们在数据框的这一列中出现的次数。

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

4

3 回答 3

2

tidyverse您可以使用separate_rowscount

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

在base R中,我们可以用分号分割字符串并用 计数table

table(unlist(strsplit(df$PL, ';')))
#If you need a dataframe
#stack(table(unlist(strsplit(df$PL, ';'))))
于 2020-11-07T00:58:17.777 回答
1

如果我正确理解您的问题,这将是解决方案:

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
于 2020-11-06T23:52:23.380 回答
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
于 2020-11-07T00:36:51.987 回答