问题描述
作为自由文本分析和分类任务的一部分,我需要根据自由文本响应所包含的单词组合为它们分配新的类别。
我有一个带有所有自由文本响应(每行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))