Создание ребер (рядов) для нескольких упоминаний в одном твите

Я получил много твитов из твиттера, используя пакет twitteR.

После того, как я сделал это успешно, моя цель - создать ребра для сетевого анализа на основе упоминаний в этих твитах. Для этого я использовал следующий код, чтобы получить имена пользователей Twitter, которые были упомянуты в твите:

tweets <- read.csv(file="tweets.csv")

tweets$mentions <- str_extract_all(tweets$text, "@\\w+")

Существуют твиты, в которых упоминается более одного имени пользователя, например "usernameA, usernameB и usernameC", но они вместе в одной строке. Теперь я хотел бы умножить строки с теми твитами, в которых упоминается более одного имени пользователя, с количеством имен пользователей в этом твите. В то же время только одно имя пользователя должно отображаться в конце строки. Позвольте мне проиллюстрировать, что я имею в виду на уже использованном примере:

В настоящее время у меня есть строка с двумя столбцами (текст, упоминания):

  1. "текст твита"; "usernameA, userNameB, usernameC"

Я хотел бы иметь три строки в этом случае:

  1. "текст твита"; "UsernameA"
  2. "текст твита"; "UsernameB"
  3. "текст твита"; "UsernameC"

Мои проблемы:

  1. Как разрешить r проверять записи, которые состоят из списка (c ("usernameA", "usernameB", ...) в указанном столбце?
  2. Как мне сказать r умножить эту определенную запись x-1 раз (x= количество упоминаний)?
  3. Как мне заставить r оставить только одно имя пользователя в каждой строке?

3 ответа

Решение

Ты можешь использовать plyr для вашей проблемы и разделите фрейм данных твитов по текстовому столбцу:

plyr::ddply(tweets, c("text"), function(x){
    mention <- unlist(stringr::str_extract_all(x$text, "@\\w+"))
    # some tweets do not contain mentions, making this necessary:
    if (length(mention) > 0){
        return(data.frame(mention = mention))
    } else {
        return(data.frame(mention = NA))    
    }
})

Пример:

tweets <- data.frame(text = c("A tweet with text and @user1 and @user2.",
                              "Another tweet @user3 and @user4 should hear about."))

Запуск вышеуказанной функции возвращает:

                                                text mention
1           A tweet with text and @user1 and @user2.  @user1
2           A tweet with text and @user1 and @user2.  @user2
3 Another tweet @user3 and @user4 should hear about.  @user3
4 Another tweet @user3 and @user4 should hear about.  @user4

Я попробовал ваш код на разных примерах и прекрасно работает, хотя проблема, с которой я не знаю, с чем столкнуться, это когда у меня есть список твитов из data.frame, и я пишу твиты как:

tweets<-data.frame(text=(table$variable))

вместо

tweets <- data.frame(text = c("A tweet with text and @user1 and @user2.",
                              "Another tweet @user3 and @user4 should hear about."))

Видимо, форматы не меняются, хотя после использования вашего кода вместо получения дескрипторов я просто получаю числа (на самом деле число "@" внутри текста).

Ответ Дейва возвращает дескрипторы вместо чисел из общего фрейма данных, если вы добавите stringsAsFactors=FALSE:

plyr::ddply(mydata, c("text"), function(x){
  mention <- unlist(stringr::str_extract_all(x$text, "@\\w+"))
  # some tweets do not contain mentions, making this necessary:
  if (length(mention) > 0){
    return(data.frame(mention = mention,stringsAsFactors=FALSE))
  } else {
    return(data.frame(mention = NA))    
  }
})
Другие вопросы по тегам