Подсчитайте частоту слов по нескольким столбцам в R - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть фрейм данных в R с несколькими столбцами с многословными текстовыми ответами, который выглядит примерно так:

1a        1b             1c       2a          2b             2c
student   job prospects  money    professors  students       campus
future    career         unsure   my grades   opportunities  university
success   reputation     my job   earnings    courses        unsure

Я хочу иметь возможность подсчитать частоту слов в столбцах 1a, 1b и 1c вместе, а также 2a, 2b и 2b вместе взятых.

В настоящее время я использую этот код для подсчета частоты слов в каждом столбце в отдельности.

data.frame(table(unlist(strsplit(tolower(dat$1a), " "))))

В идеале я хочу иметь возможность объединить два набора столбцов в два столбца, а затем использовать этот код для подсчета частоты слов, но я открыт для других вариантов.

Объединенные столбцы будут выглядеть примерно так:

1              2
student        professors
future         my grades
success        earnings
job prospects  students
career         opportunities
reputation     courses
money          campus
unsure         university
my job         unsure

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

В общем, вам следует избегать имен столбцов, которые начинаются с цифр.Кроме того, я создал воспроизводимый пример вашей проблемы и предложил решение, используя dplyr и tidyr.Функция substr() внутри mutate_at предполагает, что имена ваших столбцов соответствуют шаблону [num] [char] в вашем примере.

library(dplyr)
library(tidyr)

data <- tibble::tribble(
  ~`1a`, ~`1b`, ~`1c`, ~`2a`, ~`2b`, ~`2c`,
  'student','job prospects', 'mone', 'professor', 'students', 'campus',
  'future', 'career', 'unsure', 'my grades', 'opportunities',  'university',
  'success', 'reputation', 'my job', 'earnings', 'courses', 'unsure'
)

data %>%
  gather(key, value) %>%
  mutate_at('key', substr, 0, 1) %>%
  group_by(key) %>%
  mutate(id = row_number()) %>%
  spread(key, value) %>%
  select(-id)

# A tibble: 9 x 2
  `1`           `2`          
  <chr>         <chr>        
1 student       professor    
2 future        my grades    
3 success       earnings     
4 job prospects students     
5 career        opportunities
6 reputation    courses      
7 mone          campus       
8 unsure        university   
9 my job        unsure    
0 голосов
/ 16 ноября 2018

Если ваша конечная цель - подсчитать частоту (в отличие от переключения с широкого на длинный формат), вы можете сделать

ave(unlist(df[,paste0("a",1:3)]), unlist(df[,paste0("a",1:3)]), FUN = length)

, который будет считать частоту элементов столбцов a1,a2,a3, гдеdf обозначает фрейм данных (а столбцы помечены a1,a2,a3,b1,b2,b3).

0 голосов
/ 16 ноября 2018

Вот способ использования пакетов dplyr и tidyr. К вашему сведению, следует избегать имен столбцов, начинающихся с цифры. Называя их a1, a2 ... в конечном итоге все будет проще.

df %>% 
  gather(variable, value) %>% 
  mutate(variable = substr(variable, 1, 1)) %>% 
  mutate(id = ave(variable, variable, FUN = seq_along)) %>%
  spread(variable, value)

  id             1             2
1  1       student    professors
2  2        future     my grades
3  3       success      earnings
4  4 job prospects      students
5  5        career opportunities
6  6    reputation       courses
7  7         money        campus
8  8        unsure    university
9  9        my job        unsure

Данные -

df <- structure(list(`1a` = c("student", "future", "success"), `1b` = c("job prospects", 
"career", "reputation"), `1c` = c("money", "unsure", "my job"
), `2a` = c("professors", "my grades", "earnings"), `2b` = c("students", 
"opportunities", "courses"), `2c` = c("campus", "university", 
"unsure")), .Names = c("1a", "1b", "1c", "2a", "2b", "2c"), class = "data.frame", row.names = c(NA, 
-3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...