Отфильтруйте фрейм данных через цикл for и затем сохраните в новый фрейм данных - PullRequest
0 голосов
/ 11 октября 2018

У меня есть df для сценария телешоу с двумя столбцами, один для динамика и один для линии, которую они говорят.Я хотел бы отфильтровать все строки по динамику, а затем посчитать слова всех их строк, а затем сохранить эту информацию в новый df, как это:

Speaker Words
John    10000
Bob     20000
Doe     30000

Пример из df:

line                                                                    speaker
All right Jim. Your quarterlies look very good.                         Michael

До сих пор я придумал это:

df1 <- lines %>%
  filter(speaker == 'John')

wordcount(df1$line)

Мне было интересно, есть ли метод for-loop или другие альтернативы, которые облегчили бы этот процесс?Спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

Мне не ясно, почему вы после цикла for.Есть несколько подходов, которые вы можете использовать здесь.Кстати, вы всегда должны указывать пакеты, которые вы используете в вашем примере.

Во-первых, давайте создадим воспроизводимый пример.Мы будем вызывать функцию wordcount из пространства имен ngram без добавления пакета.

library(tidyverse)
df <- data.frame(Speaker = rep(c("John", "Bob", "Doe"),2),
                   Words = NA)
  df[df$Speaker == "John",]$Words <- "All right Jim. Your quarterlies look very good"
  df[df$Speaker == "Bob",]$Words <- "You all look good, except for John"
  df[df$Speaker == "Doe",]$Words <- "John, your performance is terrible" 

Во-первых, мы можем просто вернуть агрегированные суммы, используя tapply, и привести в data.frame на лету.

data.frame(Speaker = sort(unique(df$Speaker)), 
           total_words = as.numeric(tapply(df$Words, 
           df$Speaker, ngram::wordcount)) )

Используя конвейерный подход, мы можем последовать вашему примеруи вернуть общее количество слов для одного говорящего

df %>% 
  filter(Speaker == "John") %>%
  summarize(total_words = ngram::wordcount(Words)) %>%
  as.numeric()

Или, используя конвейерный подход, общее количество слов для всех говорящих в виде data.frame

df %>%
  group_by(Speaker) %>%
  summarize(total_words = ngram::wordcount(Words)) %>%
  as.data.frame()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...