r - 如果 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 个小时找不到它。我真的不想诉诸于列出实际术语而不是在数据框中引用它们。
任何帮助将不胜感激,请并感谢您。
解决方案
这个完全矢量化的函数似乎可以满足问题的要求。
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))
推荐阅读
- c++ - 在 android studio 项目中修复原生 C++ 代码中的奇怪链接器错误
- html - 我该如何解决 AttributeError: 'NoneType' object has no attribute 'text' 这个问题?
- java - 无法在 Intellij IDE Ultimate 2020.3 中创建 Spring 多模块项目
- python - 在excel中保存为csv时如何避免tweet id被截断
- amazon-web-services - 如何使 CodePipeline 与 Git、ECR、CodeBuild 和 CodeDeploy 一起工作?
- apache - AEM 6.3:将选择器中的点替换为斜线时出现错误请求
- javascript - 如何有效地查找范围包含的数组中的所有元素?
- sql - 更改从 SQL Server 数据库获取的数据值
- mysql - MySQL 服务器无法删除
- javascript - 未抓住(承诺)即使尝试抓住它