微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我有一个带有所有自由文本响应(每行1列,每行1个响应)(大约17,000行)的小标题数据帧(df1),并且我有一些包含一些密钥的较小的小标题(df2-df10)项(1列,每行1项)。

所有值都是字符串

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

如果来自df1的字符串值“ X”等于df 2 中的任何字符串值,则将字符串值“类别1”分配给df1中相邻列中的值“ X”。 / p>

如果来自df1的字符串值“ X”等于df 3 中的任何字符串值,则将字符串值“类别2”分配给df1中相邻列中的值“ X”。 / p>

对于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)

测试数据

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。