R: как использовать lapply для ежемесячных данных - PullRequest
1 голос
/ 07 мая 2019

У меня есть набор данных, который имеет следующие данные:

Ticket      Feed back                            Date        Month             Rating
12345   The resolution was proper             01-01-2019    January              5
12346   The ticket was closed without notice  02-01-2019    January              3
12347   Good                                  03-01-2019    January              4
12354   He is highly reliable.                03-02-2019    February             4
12355   He accomplished all tasks             04-02-2019    February             4

Я выполняю сентиментальный анализ, используя следующий код:

Словарь отрицательных слов - https://gist.github.com/mkulakowski2/4289441

словарь позитивных слов - https://gist.github.com/mkulakowski2/4289437 (создано 2 текстовых файла, начиная со строки 36)

library(stringr)
library(tm)
str(positive)  #positive words dictionary
str(negative)  #negatiive words dictionary

file <- sample_reviews$`Feed back`
file <- tolower(file)
filee <- removeWords(file,stopwords("english"))
filee <- removePunctuation(filee)
filee <- stripWhitespace(filee)
filee <- removeNumbers(filee)
filr <- str_split(filee,pattern="\\s+")
fg <- unlist(str_split(filee,pattern="\\s+"))
match(fg,positive)
match(fg,negative) 
a<-sum(!is.na(match(fg,positive)))
b<-sum(!is.na(match(fg,negative)))
c<- a+b
Positiveperc <- (a/c)*100
Negativeperc <- (b/c)*100
mat<-matrix(c(Positiveperc,Negativeperc),ncol=1)
colnames(mat) <- c('values')
rownames(mat) <- c('Positive','Negative')
dat<- cbind("Result"=rownames(mat), mat)
mydata<-data.frame(dat)  

Фрейм данных в переменной «mydata» выглядит следующим образом:

            Result       values
Positive   "Positive"   "57.785" 
Negative   "Negative"   "48.214"

Мне нужно, чтобы мой фрейм данных создавался для каждого месяца. Как в:

 Month     ValuePostive    Valuenegative
 January        34              66
 February       50              50

с токовым выходом я могу получить общий процент встречающихся положительных и отрицательных слов. Что я должен сделать, чтобы это делилось на месячный процентный график? как и за каждый месяц, мне нужен процент положительных и отрицательных настроений.

1 Ответ

1 голос
/ 08 мая 2019

Это может быть то, что вы хотели создать:

library(tidyverse)
library(reshape2)
library(tm)

# your data
x <- tibble(Ticket = c(12345, 12346, 12347 ,12354, 12355),
            Feedback = c("The resolution was proper", "The ticket was closed without notice", "Good" ,"He is highly reliable.", "He accomplished all tasks"),
            Date = c("01-01-2019", "02-01-2019", "03-01-2019", "03-02-2019", "04-02-2019"),
            Month = c("January", "January", "January", "February", "February"),
            Rating = c(5,4,4,4,4))

# reading lists
negative <- read_tsv("negative.txt",col_names=F)$X1
positive <- read_tsv("positive.txt",col_names=F)$X1
str(positive)  #positive words dictionary
str(negative)  #negatiive words dictionary


sample_reviews <- x

# List-Conversion
sample_reviews <- split(sample_reviews, sample_reviews$Month)

# Your code executed for each month
x <- lapply(sample_reviews, function(x){

file <- x$Feedback
file <- tolower(file)
filee <- removeWords(file,stopwords("english"))
filee <- removePunctuation(filee)
filee <- stripWhitespace(filee)
filee <- removeNumbers(filee)
filr <- str_split(filee,pattern="\\s+")
fg <- unlist(str_split(filee,pattern="\\s+"))
match(fg,positive)
match(fg,negative) 
a<-sum(!is.na(match(fg,positive)))
b<-sum(!is.na(match(fg,negative)))
c<- a+b
Positiveperc <- (a/c)*100
Negativeperc <- (b/c)*100
mat<-matrix(c(Positiveperc,Negativeperc),ncol=1)
colnames(mat) <- c('values')
rownames(mat) <- c('Positive','Negative')
dat<- cbind("Result"=rownames(mat), mat)
mydata<-data.frame(dat)

return(mydata)
})

# Add month as column
x <- lapply(names(x), function(names){
  x[[names]]$Month <- names
  return(x[[names]])
})

# transformation for plotting
x <- x %>%
  bind_rows() %>%
  mutate(Month = factor(Month, levels=c("January", "February"))) 

# plotting everything in the same plot
plot <- ggplot(x, aes(Result, values, fill=Month))+
  geom_bar(stat="identity", position=position_dodge())

# show plot
plot

# adding a wrap, which creates different plots based on Month
plot + facet_wrap(~Month)

Это то, что вы получаете при использовании первого варианта: enter image description here

И вот что вы добавляете facet_wrap(): enter image description here

Это то, что вы хотите произвести?

...