R - Как изменить функцию в цикле для подсчета заданных слов и добавить новый столбец для каждого - PullRequest
0 голосов
/ 07 июля 2019

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

Теперь я пытаюсь написать скрипт, который будет запускать функцию подсчета во фрейме данных с лексиконом слов, которые я объединил.

Я успешно смог использовать mutate для добавления новых столбцов с количеством для одного слова за раз, но как я могу создать цикл для выполнения этого для нескольких слов?

Я пытался использовать цикл for, а также применять, но безрезультатно.

Вот код, который работает для добавления отдельных столбцов:

data_frame2 <- data_frame1 %>% 
  mutate(word1 = CountSelectWords(chat_description, "word1"), 
         word2 = CountSelectWords(chat_description, "word2"))

где «word1» и «word2» - слова для поиска в каждом сообщении; и "chat_description" - это имя интересующего столбца.

Результатом является новый фрейм данных (data_frame2) с 2 дополнительными столбцами, названными соответственно «word1» и «word2», в которых перечисляется количество этих слов в каждой строке.

Однако, когда я пытаюсь написать словарь слов и создать цикл for на его основе, это не сработает:

lexicon <- c("word1", "word2", "word3", "word4", "word5")

for (i in lexicon) {

  data_frame3 <- data_frame1 %>% 
    mutate(paste("countof", as.character(i), sep = "_") = CountSelectWords(chat_description, i))
}

При попытке запустить цикл for появляется следующее сообщение об ошибке:

Error: unexpected '=' in:
"data_frame3 <- data_frame1 %>% 
    mutate(paste("countof", as.character(i), sep = "_") ="

Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 07 июля 2019

Мы можем использовать map

library(tidyverse)
wordvec <- c("word1", "word2")
map_dfc(wordvec ~ CountSelectWords(chat_description, .x)) %>%
        rename_all(~ str_c("countof_", wordvec)) %>%     
        bind_cols(data_frame1, .)

В цикле for, если мы хотим назначить использование :=

data_frame3 <- data_frame1
for (i in lexicon) {

  data_frame3 <- data_frame3 %>% 
    mutate( !! paste("countof", i, sep = "_") := 
            CountSelectWords(chat_description, i))
}

Используя воспроизводимый пример

data(iris)
set.seed(24)
iris$chat_description <- sample(c("word1", "word2"), nrow(iris), replace = TRUE)
lexicon <- wordvec
for(i in lexicon) {
     iris <- iris %>%
                mutate(!! paste("countof", i, sep="_") := 
                      sum(chat_description == i))

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...