2017-02-13 25 views
1

У меня есть кадр данных, содержащий ответы об опросах с каждой строкой, представляющей другого человека. Один столбец - «Текст» - это текстовый вопрос с открытым текстом. Я хотел бы использовать Tidytext :: unnest_tokens так, что я делаю анализ текста по каждой строке, в том числе настроения оценки, подсчет слов и т.д.Использование подхода с вложенным списком столбцов и Purrr вместе с Tidytext :: Unnest_Tokens

Вот простой dataframe для этого примера:

Satisfaction<-c ("Satisfied","Satisfied","Dissatisfied","Satisfied","Dissatisfied") 
Text<-c("I'm very satisfied with the services", "Your service providers are always late which causes me a lot of frustration", "You should improve your staff training, service providers have bad customer service","Everything is great!","Service is bad") 
Gender<-c("M","M","F","M","F") 
df<-data.frame(Satisfaction,Text,Gender) 

Я тогда повернул колонку «Текст» в символ ...

df$Text<-as.character(df$Text) 

Далее я сгруппировал столбец идентификаторов и вложил данные.

df<-df%>%mutate(id=row_number())%>%group_by(id)%>%unnest_tokens(word,Text)%>%nest(-id) 

Как далеко, кажется, работает нормально, но теперь, как я могу использовать purrr :: карта функции для работы на вложенном списке столбца «слово»? Например, если я хочу создать новый столбец, используя dplyr :: mutate с подсчетом слов для каждой строки?

Кроме того, есть ли лучший способ вставить рамку данных, чтобы только столбец «Текст» был вложенным списком?

+0

Не совсем понятно, что вы хотите. Вы можете выполнять анализ текста, не используя 'purrr :: nest', просто остановитесь после' unnest_tokens'. Если вы хотите вставить только столбец слов, вы можете выполнить «nest (word)», но для его работы вам необходимо «разгруппировать» фрейм данных сначала (или не группировать по идентификатору в первую очередь) – FlorianGD

ответ

0

Мне нравится использовать purrr::map, чтобы сделать modeling for different groups, но за то, что вы говорите о делах, я думаю, вы можете придерживаться только прямого dplyr.

Вы можете настроить свой dataframe так:

library(dplyr) 
library(tidytext) 

Satisfaction <- c("Satisfied", 
        "Satisfied", 
        "Dissatisfied", 
        "Satisfied", 
        "Dissatisfied") 

Text <- c("I'm very satisfied with the services", 
      "Your service providers are always late which causes me a lot of frustration", 
      "You should improve your staff training, service providers have bad customer service", 
      "Everything is great!", 
      "Service is bad") 

Gender <- c("M","M","F","M","F") 

df <- data_frame(Satisfaction, Text, Gender) 

tidy_df <- df %>% 
    mutate(id = row_number()) %>% 
    unnest_tokens(word, Text) 

Тогда, чтобы найти, например, количество слов в строке, вы можете использовать group_by и mutate.

tidy_df %>% 
    group_by(id) %>% 
    mutate(num_words = n()) %>% 
    ungroup 
#> # A tibble: 37 × 5 
#> Satisfaction Gender id  word num_words 
#>   <chr> <chr> <int>  <chr>  <int> 
#> 1  Satisfied  M  1  i'm   6 
#> 2  Satisfied  M  1  very   6 
#> 3  Satisfied  M  1 satisfied   6 
#> 4  Satisfied  M  1  with   6 
#> 5  Satisfied  M  1  the   6 
#> 6  Satisfied  M  1 services   6 
#> 7  Satisfied  M  2  your  13 
#> 8  Satisfied  M  2 service  13 
#> 9  Satisfied  M  2 providers  13 
#> 10 Satisfied  M  2  are  13 
#> # ... with 27 more rows 

Вы можете сделать анализ настроений путем осуществления внутреннего соединения; выезд some examples here.

+0

Спасибо за помощь и примеры! – Mike