R中如何将完整vector/list绑定到dataframe每一行而无需合并再拆分?
实现方案
直接将关键词向量用list()包裹后赋值即可,无需经过字符串拼接再拆分的冗余步骤,示例代码如下:
library(dplyr) library(tidyr) library(stringr) # 原有数据定义保持不变 df <- tibble(text = c( "I really like apples, tomoatoes, and cucumbers", "I really like berries, chocolate, and apples", "I really like avocado, chocolate, and carrots" )) keywords <- c("apple", "tomato", "cucumbe", "chocolate", "avocado") # 核心逻辑:将整个关键词向量作为列表元素绑定到每一行 df %>% mutate(keyword = list(keywords)) %>% unnest(keyword)
原操作报错原因
最初直接赋值mutate(keyword = keywords)报错,是因为dplyr的mutate默认为向量化运算,会尝试将长度为5的keywords向量循环匹配到3行的df中,长度不匹配就会抛出异常。而用list()包裹后,整个关键词向量会被识别为单个列表元素,每一行都存储完整的关键词列表,和df的行数完全匹配。
扩展:更高效的关键词检索方案
如果只是需要做文本关键词匹配,不需要先展开所有关键词再过滤,可以直接用正则匹配实现,性能更高:
- 筛选包含任意关键词的行:
df %>% filter(str_detect(text, str_c(keywords, collapse = "|")))
- 提取每行匹配到的所有关键词:
df %>% mutate(matched_keywords = str_extract_all(text, str_c(keywords, collapse = "|")))
注意:原有实现中的
keywords$keyword写法存在问题,keywords本身是字符向量不是数据框,无需用$取列。
内容的提问来源于stack exchange,提问作者Ben G
相关产品推荐
相关产品推荐

