首页 > 解决方案 > 如果 df1 中的字符串值“X”等于 df2 中的任何字符串值,则将类别“1”分配给 R 中 df1 中的新列中的值 X

问题描述

作为自由文本分析和分类任务的一部分,我需要根据它们包含的单词组合为一些自由文本响应分配新类别。

我有一个包含所有自由文本响应(1 列,每行 1 个响应)(约 17k 行)的 tibble 数据框(df1),并且我有许多较小的 tibbles(df2 - df10),其中包含一些关键术语(1列,每行 1 个术语)。

所有值都是字符串

我正在尝试编写一些执行以下操作的 R 代码:

如果 df1 中的字符串值“X”等于 df 2中的任何字符串值,则将字符串值“Category 1”分配给 df1 中相邻列的值“X”。

如果 df1 中的字符串值“X”等于 df 3中的任何字符串值,则将字符串值“Category 2”分配给 df1 中相邻列中的值“X”。

df4-df10 以此类推。

以下是我到目前为止尝试过的代码。为简单起见,这里我只匹配 df2(类别 1 术语)并将“其他”分配给不匹配的所有其他内容。

df1 %>%
  select(response) %>%
  mutate(
    category = case_when(
      df2$term %in% response ~ " Category 1",
      TRUE                ~ "other"
    )
  )

运行此程序时出现以下错误:

Error: Problem with `mutate()` input `category`.
x Input `category` can't be recycled to size 16585.
i Input `category` is `case_when(df2$terms %in% responses~ "1", TRUE ~ "other")`.
i Input `category` must be size 16585 or 1, not 29

显然,由于 df1 和 df2 的大小不同,存在一个问题,我确信有一个简单的解决方案,但我已经绕圈子 2-3 个小时找不到它。我真的不想诉诸于列出实际术语而不是在数据框中引用它们。

任何帮助将不胜感激,请并感谢您。

标签: rdplyrtext-classification

解决方案


这个完全矢量化的函数似乎可以满足问题的要求。

new_col <- function(X, String, Y){
  i <- X[[1]] %in% String
  X[[2]] <- "other"
  if(any(Y[[1]] %in% String)) X[[2]][i] <- "Category 1"
  X
}

new_col(df1, "M", df2)

测试数据

set.seed(2020)
df1 <- data.frame(col1 = sample(LETTERS, 50, TRUE))
df2 <- data.frame(col1 = sample(LETTERS, 10, TRUE))

推荐阅读