Найти список строк, которые соответствуют

#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. да, это делает именно то, что мне было нужно, приятно!