Создание ребер (рядов) для нескольких упоминаний в одном твите
Я получил много твитов из твиттера, используя пакет twitteR.
После того, как я сделал это успешно, моя цель - создать ребра для сетевого анализа на основе упоминаний в этих твитах. Для этого я использовал следующий код, чтобы получить имена пользователей Twitter, которые были упомянуты в твите:
tweets <- read.csv(file="tweets.csv")
tweets$mentions <- str_extract_all(tweets$text, "@\\w+")
Существуют твиты, в которых упоминается более одного имени пользователя, например "usernameA, usernameB и usernameC", но они вместе в одной строке. Теперь я хотел бы умножить строки с теми твитами, в которых упоминается более одного имени пользователя, с количеством имен пользователей в этом твите. В то же время только одно имя пользователя должно отображаться в конце строки. Позвольте мне проиллюстрировать, что я имею в виду на уже использованном примере:
В настоящее время у меня есть строка с двумя столбцами (текст, упоминания):
- "текст твита"; "usernameA, userNameB, usernameC"
Я хотел бы иметь три строки в этом случае:
- "текст твита"; "UsernameA"
- "текст твита"; "UsernameB"
- "текст твита"; "UsernameC"
Мои проблемы:
- Как разрешить r проверять записи, которые состоят из списка (c ("usernameA", "usernameB", ...) в указанном столбце?
- Как мне сказать r умножить эту определенную запись x-1 раз (x= количество упоминаний)?
- Как мне заставить 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))
}
})