R-如何循环更改函数以计算给定单词并为每个单词添加新列

时间:2019-07-06 21:13:30

标签: r loops apply mutate

我有一个数据框,其中显示了从各种用户(每行一个用户)接收到的消息。我编写了一个函数(称为CountSelectWords),该函数可以计算每个消息中给定单词或短语的实例。

现在,我正在尝试编写一个脚本,该脚本将使用连接的单词词典在数据框上运行计数功能。

我已经成功地能够使用mutate一次添加一个单词计数的新列,但是如何创建一个循环以在多个单词上运行呢?

我尝试使用for循环以及apply,但无济于事。

以下是用于添加各个列的代码:

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 :(得分:0)

我们可以使用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))

  }