如何逐行比对数据框字符串列与列表列并统计出现频次?
解决Tibble中逐行统计字符串在对应列表列中出现次数的问题
你需要在tibble里逐行统计V1列的字符串在对应行V2列表中的出现次数并生成V3列,之前使用的matches <- x[!x$V1 %in% x$V2]逻辑有误:该代码是将整个V1列与所有行V2列表的合并集合做匹配,而非逐行对应检查,因此得到空数据框。
数据构造代码
df <- tibble::tribble( ~V1, ~V2, "oranges", c("oranges", "apples", "berries", "plums", "cherries"), "apples", c("oranges", "apples", "berries", "bananas", "apples"), "grapes", c("oranges", "apples", "berries", "plums", "cherries"), "berries", c("berries", "apples", "berries", "plums", "cherries"), )
正确实现方法
方法1:用dplyr逐行处理
通过rowwise()指定逐行操作,再用sum()统计匹配次数:
library(dplyr) df <- df %>% rowwise() %>% mutate(V3 = sum(V2 == V1)) %>% ungroup()
方法2:用purrr批量处理
map2_int()可同时遍历V1和V2的每一组对应元素,直接返回整数结果:
library(purrr) library(dplyr) df <- df %>% mutate(V3 = map2_int(V1, V2, ~sum(.y == .x)))
运行结果
处理后的数据框与你给出的示例一致:
# A tibble: 4 × 3 V1 V2 V3 <chr> <chr> <int> 1 oranges c("oranges", "apples", "berries", "plums", "cherries") 1 2 apples c("oranges", "apples", "berries", "bananas", "apples") 2 3 grapes c("oranges", "apples", "berries", "plums", "cherries") 0 4 berries c("berries", "apples", "berries", "plums", "cherries") 2
内容的提问来源于stack exchange,提问作者Munrock
相关产品推荐
相关产品推荐

