我有一个数据框,其中显示了从各种用户(每行一个用户)接收到的消息。我编写了一个函数(称为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 = "_") ="
任何帮助将不胜感激!
答案 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))
}