Отфильтруйте столбец по слову и произведите расчет по двум другим столбцам. - PullRequest
0 голосов
/ 12 марта 2019

Пожалуйста, извините, если это похоже на дубликат вопроса. Я долго искал, но не смог сосредоточиться на одном.

У меня есть набор данных с колонкой для текста и другой с первым словом текста.

Есть еще два столбца для того, сколько людей было отправлено и сколько прочитало текст.

Пример данных:

df <- data.frame(Word = c("Happy", "Good", "Have", "Do"), 
                 Text = c("Happy Birthday", "Good Morning", "Have a good day", 
                           "Do you have happy news"), 
                  Sent = c(10, 20, 15, 20), 
                  Read = c(8, 12, 9, 13), stringsAsFactors = FALSE)

Я хочу рассчитать скорость чтения для каждого слова. Он рассчитывается из текстов, которые содержат это слово

Я попробовал приведенный ниже код, но, кажется, работает вечно, но без сообщения об ошибке.

Я знаю, что цикл не эффективен для 18К записей в моем случае, и я предпочитаю эффективное решение в R.

Ценю любую помощь в этом отношении.

for (i in 1:nrow(messages)){

  word <- messages$Word[i]
  messages$Rate[i] <- messages%>% filter(str_detect(string = Text, pattern = word)) %>% summarise(sum(Read)/sum(Sent))

}

enter image description here

1 Ответ

1 голос
/ 12 марта 2019

В одну сторону, используя базу R sapply, для каждого Word мы находим индексы (inds), где это Word встречается в кадре данных. Используя эти индексы, мы подставляем в столбцы и sum Read и Sent столбцы и вычисляем соотношение.

df$Rate <- with(df, sapply(Word, function(x) {
          inds = grep(paste0("\\b", x, "\\b"), Text, ignore.case = TRUE)
          sum(Read[inds])/sum(Sent[inds])
}))


df
#   Word                   Text Sent Read      Rate
#1 Happy         Happy Birthday   10    8 0.7000000
#2  Good           Good Morning   20   12 0.6000000
#3  Have        Have a good day   15    9 0.6285714
#4    Do Do you have happy news   20   13 0.6500000

Если вы предпочитаете tidyverse подход, который делает то же самое, используя map_dbl

library(tidyverse)
df %>%
   mutate(Ratio = map_dbl(Word, function(x) {
                   inds = str_detect(Text, fixed(x, ignore_case=TRUE))
                    sum(Read[inds])/sum(Sent[inds])
}))

данные

df <- data.frame(Word = c("Happy", "Good", "Have", "Do"), 
                 Text = c("Happy Birthday", "Good Morning", "Have a good day", 
                           "Do you have happy news"), 
                  Sent = c(10, 20, 15, 20), 
                  Read = c(8, 12, 9, 13), stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...