首页 > 解决方案 > 如何将字符向量转换为变量名和str_count?

问题描述

我正在尝试通过针对文本数据帧执行 str_count 的函数将术语的字符向量转换为变量,但我不确定如何执行此操作。

给定一个向量,如:

variablenames <- c("strong","weak","happy","sad")

和文本数据框,例如:

library(tidyverse)
textdf <- as.data.frame("Happy was a dwarf who was perpetually sad.") %>% rename(text = 1)

我想要这样的东西:

countstring_fn <- function(variablenames,textdf){
for(term in variablenames){
paste0(term,"count") <- str_count(term,textdf)
}
}

但我很确定这是行不通的。预期的输出是:

text,strongcount,weakcount,happycount,sadcount
"Happy was a dwarf who was perpetually sad.",0,0,1,1

有没有人做过这样的事情并让它发挥作用?

标签: rtidyversestringr

解决方案


这是另一种方式。

library(tidyverse)
variablenames <- c("strong", "weak", "happy", "sad")
textdf <- tibble(
  text = c(
    '"Happy was a dwarf who was perpetually sad."',
    '"If you\'re strong, you\'re not weak."'
  )
)
textdf[, str_c(variablenames, 'count')] <- do.call(
  rbind, 
  lapply(
    textdf$text, 
    function(df) { 
      str_count(toupper(df), toupper(variablenames)) 
    }
  )
)
invisible(
  apply(
    textdf, 
    1, 
    function(vec) {
      cat(str_c(str_c(vec, collapse = ','), '\n'))
    }
  )
)

这里的主要区别是数据框中的字符串textdf用双引号括起来(如果您从 .csv 导入数据,则可以调用str_c('"', textdf$text, '"')相同的效果)。然后,我们将所有文本和模式转换为大写,以确保找到所有匹配项。最后,我们可以调用str_count()以获取计数的整数向量,我们可以通过定义所需的列名将其单独分配给特定列。

然后该prntFunc函数将数据框中的每一行打印到控制台使用apply()(矢量化比使用 for 循环更快):

"Happy was a dwarf who was perpetually sad.",0,0,1,1
"If you're strong, you're not weak.",1,1,0,0

我们首先使用str_c()它的折叠能力。换句话说,我们可以将一行中所有五列中的字符串连接成一个字符串,作为分隔符。然后,对于,我们需要再次使用在每个“行字符串”的末尾cat()附加一个换行符( ) 。最后,我们可以调用以在控制台中显示带有特殊字符的字符串,例如不带有转义字符 ( ) 的字符串。调用被包装以抑制在交互调用时附加到末尾的 。\nstr_c()cat()"\cat()invisible()NULLcat()


推荐阅读