如果字符串值为“;X";在df1中等于df2中的任何字符串值,分配category";1“;在R中的df1中的新列中设置X值

如果字符串值为“;X";在df1中等于df2中的任何字符串值,分配category";1“;在R中的df1中的新列中设置X值,r,dplyr,text-classification,R,Dplyr,Text Classification,作为自由文本分析和分类任务的一部分,我需要根据包含的单词组合为一些自由文本响应分配新的类别 我有一个包含所有自由文本响应(1列,每行1个响应)(约17k行)的TIBLE数据帧(df1),还有一些较小的TIBLE(df2-df10),其中包含一些关键术语(1列,每行1个术语) 所有值都是字符串 我正在尝试编写一些R代码,以实现以下功能: 如果df1中的字符串值“X”等于df2中的任何字符串值,请将字符串值“类别1”指定给df1中相邻列中的值“X” 如果df1中的字符串值“X”等于df3中的任何字符

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

我有一个包含所有自由文本响应(1列,每行1个响应)(约17k行)的TIBLE数据帧(df1),还有一些较小的TIBLE(df2-df10),其中包含一些关键术语(1列,每行1个术语)

所有值都是字符串

我正在尝试编写一些R代码,以实现以下功能:

如果df1中的字符串值“X”等于df2中的任何字符串值,请将字符串值“类别1”指定给df1中相邻列中的值“X”

如果df1中的字符串值“X”等于df3中的任何字符串值,则将字符串值“类别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个小时的圈子,找不到它。我真的不想求助于列出实际的术语,而不是在数据框架中引用它们


非常感谢您的帮助。

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

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)

new\u col在%df2$term中尝试
response%,看看它是否有效。另外,您能否以
dput
格式发布样本数据?请使用
dput(head(df1,20))
df2
@RuiBarradas的输出编辑问题-您的建议有效!非常感谢这是如何完全矢量化的<代码>新列(df1、c(“A”、“B”)、df2)
将不起作用
set.seed(2020)
df1 <- data.frame(col1 = sample(LETTERS, 50, TRUE))
df2 <- data.frame(col1 = sample(LETTERS, 10, TRUE))