Вызов функции в mapply, возвращающем список, а не фрейм данных - PullRequest
0 голосов
/ 14 октября 2018

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

> create_sentiment_df('taggreason', 'republican', 'lost')
Joining, by = "word"
Joining, by = "word"
      sentiment prop.sentiment twitter.name      party election.result
1         anger     0.04721931   taggreason republican            lost
2  anticipation     0.14375656   taggreason republican            lost
3       disgust     0.01259182   taggreason republican            lost
4          fear     0.06190976   taggreason republican            lost
5           joy     0.09024134   taggreason republican            lost
6      negative     0.10073452   taggreason republican            lost
7      positive     0.26862539   taggreason republican            lost
8       sadness     0.03777545   taggreason republican            lost
9      surprise     0.03882476   taggreason republican            lost
10        trust     0.19832109   taggreason republican            lost

Однако я хочу выполнить это несколько раз, поэтому я использую mapply в каждой строке фрейма данных.Вот данные с фреймом данных только в 1 строку (для тестирования):

> datt1
# A tibble: 1 x 4
  twtr_handle party      result district_flipped
  <chr>       <chr>      <chr>  <chr>           
1 taggreason  republican lost   flipped    

А затем вызов функции:

rslt <- mapply(create_sentiment_df, datt1$twtr_handle, datt1$party, datt1$result)

, который возвращает:

> rslt
                taggreason  
sentiment       Character,10
prop.sentiment  Numeric,10  
twitter.name    Character,10
party           Character,10
election.result Character,10

или:

enter image description here

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

library(rtweet)
library(tidytext)
library(tidyverse)
library(BBmisc)
library(reshape)

create_token(
  app = "Flippable Sentiment Analysis",
  consumer_key = c_k,
  consumer_secret = c_s,
  access_token <- a_t,
  access_secret <- a_s)

create_sentiment_df <- function(twitter.name, party, election.result) {
  va_stop_words <- stop_words %>% select(-lexicon) %>% 
    bind_rows(data.frame(word = c("https", "t.co", "rt", "amp")))
  nrc_lex <- get_sentiments("nrc") # many sentiments

  dat <- get_timeline(twitter.name, n=3200)
  dat$created_at <- as.Date(dat$created_at)
  dat_2017 <- subset(dat, created_at > as.Date('2017-01-01') & created_at < as.Date('2017-11-06'))

  dat_words <- dat_2017 %>% 
    select(status_id, text) %>% 
    unnest_tokens(word,text)

  dat_words_interesting <- dat_words %>% anti_join(va_stop_words)
  dat_sentiment <- dat_words_interesting %>% left_join(nrc_lex)
  dat_sentiment_count <- dat_sentiment %>% 
    filter(!is.na(sentiment)) %>% 
    group_by(sentiment) %>% 
    summarise(prop.sentiment=n())
  dat_sentiment_count <- na.omit(dat_sentiment_count)

  dat_sentiment_count <- cbind(dat_sentiment_count[1], 
                            prop.table(data.matrix(dat_sentiment_count[-1]), margin=2))

  # dat_sentiment_count$twitter.name <- NA
  dat_sentiment_count$twitter.name <- twitter.name
  dat_sentiment_count$party <- party
  dat_sentiment_count$election.result <- election.result

  return(as.data.frame(dat_sentiment_count))
}

1 Ответ

0 голосов
/ 14 октября 2018

Ваша функция create_sentiment_df возвращает data.frame, а mapply упрощает его по умолчанию.

Если вам нужен список data.frames, вы можете сделать:

mapply(create_sentiment_df, datt1$twtr_handle, datt1$party, datt1$result, SIMPLIFY = FALSE)

Если вам требуется один data.frame для всех выходных данных data.frame, используйте:

do.call(rbind, mapply(create_sentiment_df, datt1$twtr_handle,
                      datt1$party, datt1$result, SIMPLIFY = FALSE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...