Разница в оценках настроения между первым и последним входящим сообщением - PullRequest
3 голосов
/ 29 января 2020

У меня есть датафрейм, в котором каждая строка имеет уникальный идентификатор разговора. Каждый разговор состоит из уникальных сообщений, которые могут быть входящими или ответными (но не обоими) (клиенты публикуют входящие сообщения, а агенты публикуют ответы). Каждое сообщение имеет оценку настроения.

Я хочу рассчитать изменение настроения путем измерения разницы между первым входящим сообщением и последним входящим сообщением. Ниже приведен пример фрейма данных.

# A tibble: 11 x 11
   conversationID postID postType conversationOrd… incomingOrder responseOrder createdDate closedDate convResponseHan…    tar sentence_score
            <dbl>  <dbl> <chr>               <dbl>         <dbl>         <dbl> <chr>       <chr>                 <dbl>  <dbl>          <dbl>
 1       25455628 4.74e7 Incomin…                2             2            NA 10/07/2019… 10/07/201…            NA     NA             0    
 2       25455725 4.74e7 Incomin…                1             1            NA 10/07/2019… 10/10/201…            NA     NA             0    
 3       25455725 4.74e7 Incomin…                2             2            NA 10/07/2019… 10/10/201…            NA     NA             0    
 4       25455725 4.74e7 Incomin…                3             3            NA 10/07/2019… 10/10/201…            NA     NA             0    
 5       25455725 4.18e6 Response                4            NA             1 10/08/2019… 10/10/201…            23.4  748.            0.184
 6       25456349 4.74e7 Incomin…                1             1            NA 10/07/2019… 10/08/201…            NA     NA             0.3  
 7       25456349 4.18e6 Response                2            NA             1 10/07/2019… 10/08/201…             3.17   5.15          0.440
 8       25456349 4.74e7 Incomin…                3             2            NA 10/07/2019… 10/08/201…            NA     NA             0.113
 9       25456349 4.18e6 Response                4            NA             2 10/07/2019… 10/08/201…             0.67   3.03          0.786
10       25456349 4.74e7 Incomin…                5             3            NA 10/07/2019… 10/08/201…            NA     NA             0.214
11       25456349 4.18e6 Response                6            NA             3 10/07/2019… 10/08/201…             1.58   2.43          0.251

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

Вот вывод dput().

structure(list(conversationID = c(25455628, 25455725, 25455725, 
25455725, 25455725, 25456349, 25456349, 25456349, 25456349, 25456349, 
25456349), postID = c(47371258, 47371485, 47371486, 47373371, 
4184259, 47373084, 4181224, 47374183, 4181324, 47375140, 4181430
), postType = c("Incoming Post", "Incoming Post", "Incoming Post", 
"Incoming Post", "Response", "Incoming Post", "Response", "Incoming Post", 
"Response", "Incoming Post", "Response"), conversationOrder = c(2, 
1, 2, 3, 4, 1, 2, 3, 4, 5, 6), incomingOrder = c(2, 1, 2, 3, 
NA, 1, NA, 2, NA, 3, NA), responseOrder = c(NA, NA, NA, NA, 1, 
NA, 1, NA, 2, NA, 3), createdDate = c("10/07/2019 08:45:14 PM -0400", 
"10/07/2019 08:48:25 PM -0400", "10/07/2019 08:48:25 PM -0400", 
"10/07/2019 09:20:26 PM -0400", "10/08/2019 09:16:24 AM -0400", 
"10/07/2019 09:15:45 PM -0400", "10/07/2019 09:20:52 PM -0400", 
"10/07/2019 09:35:47 PM -0400", "10/07/2019 09:38:47 PM -0400", 
"10/07/2019 09:55:49 PM -0400", "10/07/2019 09:58:13 PM -0400"
), closedDate = c("10/07/2019 08:49:36 PM -0400", "10/10/2019 09:16:44 AM -0400", 
"10/10/2019 09:16:44 AM -0400", "10/10/2019 09:16:44 AM -0400", 
"10/10/2019 09:16:44 AM -0400", "10/08/2019 09:06:33 PM -0400", 
"10/08/2019 09:06:33 PM -0400", "10/08/2019 09:06:33 PM -0400", 
"10/08/2019 09:06:33 PM -0400", "10/08/2019 09:06:33 PM -0400", 
"10/08/2019 09:06:33 PM -0400"), convResponseHandleTime = c(NA, 
NA, NA, NA, 23.42, NA, 3.17, NA, 0.67, NA, 1.58), tar = c(NA, 
NA, NA, NA, 748.28, NA, 5.15, NA, 3.03, NA, 2.43), sentence_score = c(0, 
0, 0, 0, 0.183532587096449, 0.3, 0.439929079364222, 0.1125, 0.785712147332011, 
0.21354963890361, 0.251196909045889)), row.names = c(NA, -11L
), class = c("tbl_df", "tbl", "data.frame"))

1 Ответ

4 голосов
/ 29 января 2020

Поскольку вы смотрите только на Incoming Post, чтобы определить изменение оценок настроений, вы можете отфильтровать по этой переменной.

Я бы договорился по converationOrder, чтобы убедиться, что они в порядке, прежде чем выбрать первый и последний в каждой группе, определенной как conversationID.

. sentimentChange вычтет последнее из первого. Тогда он будет закодирован для вашего sentimentChange на основании того, что он больше или меньше нуля (или того же).

library(tidyverse)

df %>%
  filter(postType == "Incoming Post") %>%
  arrange(conversationID, conversationOrder) %>%
  group_by(conversationID) %>%
  summarise(sentimentChange = last(sentence_score) - first(sentence_score)) %>%
  mutate(sentimentConversion = case_when(
    sentimentChange < 0 ~ "Down",
    sentimentChange > 0 ~ "Up",
    sentimentChange == 0 ~ "Same"))

Выход

# A tibble: 3 x 3
  conversationID sentimentChange sentimentConversion
           <dbl>           <dbl> <chr>              
1       25455628          0      Same               
2       25455725          0      Same               
3       25456349         -0.0865 Down
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...