#r
#r
Вопрос:
У меня есть набор данных хэштегов, используемых в твитах. Каждая строка — это определенный твит, а каждая переменная — это отдельный хэштег, используемый в каждом твите, поэтому многие переменные пусты для некоторых наблюдений. потому что у них меньше хэштегов. Моя конечная цель — увидеть совпадение 3 самых популярных хэштегов, но для этого я хочу сначала посмотреть, в каких твитах используются эти хэштеги top3.
Мой набор данных выглядит примерно так:
V1 | V2 | V3 | top3
nyc| | | nyc, cool, nyc2016
cool| nyc | | nyc, cool, nyc2016
hello| cool | nyc | nyc, cool, nyc2016
winter| nyc | | nyc, cool, nyc2016
Итак, в этом примере топ-3 хэштегов были nyc и cool, но не hello и winter .
Я попытался проверить, был ли каждый хэштег среди top3, выполнив
df1<-sapply(df$V1, function(x) grepl(sprintf('\b%s\b', x), df$top3))
Но это занимает слишком много времени. И тогда мне пришлось бы сделать это для V2 и V3 (можно было бы выполнить цикл, но для его выполнения потребовалось бы еще больше времени).
Есть предложения?
Комментарии:
1.
sapply(df$V1, function(x) x %in% unlist(strsplit(df$top3, ", ")))
?
Ответ №1:
Можем ли мы с уверенностью предположить top3
, что он уникален в вашем наборе данных? Если это так:
df <- read.table(
textConnection(" V1 | V2 | V3 | top3
nyc| | | nyc, cool, nyc2016
cool| nyc | | nyc, cool, nyc2016
hello| cool | nyc | nyc, cool, nyc2016
winter| nyc | | nyc, cool, nyc2016"),
sep = "|", header = TRUE, stringsAsFactors = FALSE, strip.white = TRUE)
library(dplyr) ; library(stringr)
top <- str_split(df$top3[[1]], pattern = ", ")[[1]]
is_in_top <- function(x) x %in% top
mutate_each(df, funs(is_in_top), vars = V1:V3)
Комментарии:
1. Сработало идеально и очень быстро! Намного лучше, чем моя первоначальная идея использовать цикл.
Ответ №2:
Я всегда старался бы получить свои данные в нормализованном или длинном формате, прежде чем выполнять такую операцию. Я чувствую, что мои данные намного более гибкие таким образом. Хотя решение, упомянутое в комментарии, вероятно, тоже работает, я хотел бы поделиться своим решением:
library(dplyr)
library(tidyr)
df <- data.frame(v1 = c('nyc','cool','hello','winter')
,v2 = c(NA,'nyc','cool','nyc')
,v3 = c(NA,NA,'nyc',NA)
,stringsAsFactors = F)
top3 <- c('nyc','cool','nyc2016')
df %>% mutate(id = row_number()) %>% gather(n, word,-id) %>%
filter(!is.na(word)) %>% group_by(id) %>%
summarise(n_in_top3 = sum(ifelse(word %in% top3,1,0)))
приводит к:
id n_in_top3
(int) (dbl)
1 1
2 2
3 2
4 1
Результатом является сводка с подсчетом количества слов в списке 3 лучших слов для каждой строки в ваших данных.
Если вы хотите, чтобы он имел TRUE/FALSE
значение для каждого из столбцов, выполните следующие действия:
df %>% mutate(id = row_number()) %>% gather(n, word,-id) %>%
filter(!is.na(word)) %>% group_by(id, n) %>%
summarise(n_in_top3 = (word %in% top3)) %>%
spread(n, n_in_top3)
что дает:
id v1 v2 v3
<int> <lgl> <lgl> <lgl>
1 TRUE NA NA
2 TRUE TRUE NA
3 FALSE TRUE TRUE
4 FALSE TRUE NA
Комментарии:
1. Спасибо! Это сработало, но мне нужно было идентифицировать каждый используемый тег, а не количество, извините, если это не было ясно в моем вопросе. Но, по сути, ответ, который я использовал ниже, такой же, как и ваш.
2. скорректировал мой анализатор. Конечно, это дело вкуса. Вся дорога ведет в Рим.
3. да, это делает именно то, что мне было нужно, приятно!