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

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

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

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

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

Есть твиты, в которых упоминается более одного имени пользователя, например «имя пользователя A, имя пользователя B и имя пользователя C», но они находятся вместе в одной строке. Теперь я хотел бы умножить строки с теми твитами, в которых упоминается более одного имени пользователя, с количеством имен пользователей в этих твитах. В то же время в конце каждой строки должно отображаться только одно имя пользователя. Позвольте мне проиллюстрировать, что я имею в виду, на уже использованном примере:

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

  1. «текст твита»; "имя пользователяA, имя пользователяB, имя пользователяC"

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

  1. «текст твита»; "имя пользователяА"
  2. «текст твита»; "имя пользователяB"
  3. «текст твита»; "имя пользователяC"

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

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

person Kichaa    schedule 05.11.2014    source источник


Ответы (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
person Dave    schedule 13.01.2015

Я попробовал ваш код на разных примерах и отлично работает, хотя проблема, с которой я не знаю, как справиться, заключается в том, что у меня есть список твитов из 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."))

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

person Francisco Calvo Pérez    schedule 06.08.2015

Ответ Дэйва возвращает дескрипторы вместо чисел из общего фрейма данных, если вы добавите 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))    
  }
})
person Joe Wasserman    schedule 07.10.2017