【发布时间】:2017-01-12 08:43:53
【问题描述】:
我有一个以下形式的大型数据集,其中包含从语料库中提取的文本字符串:
Category Group Text_Strings
1 A c(string1, string2, string3)
1 A c(string1, string3)
1 B character(0)
1 B c(string1)
1 B c(string3)
2 A character(0)
2 A character(0)
2 B c(string1, string3)
3 A c(string1, string2, string3)
3 A character(0)
3 A c(string1)
3 B character(0)
3 B c(string1, string2, string3)
...其中 A 和 B 在类别 1 中有共同的 string1 和 string3;第 2 类中没有共同点;并且所有三个都属于第 3 类。
我想计算每个类的 A 组和 B 组之间匹配的字符串数。字符串匹配可以是任何顺序;例如针对 c(string2, string1) 评估的 c(string1, string2) 应计为两个匹配项。此外,匹配只能在每个类别中的唯一字符串之间进行;例如c(string1, string2), c(string1) vs. c(string2, string1) 应该仍然只有两个匹配项。例如:
Category Group Text_Strings
4 A c(string1, string2, string3)
4 A c(string1)
4 B c(string1)
4 B c(string1)
... 即使 string1 重复,也只会产生一个匹配项。
我的最终输出应该是这样的:
Category Matches
1 2
2 0
3 3
4 1
我做了很多研究,但我无法自己找出答案。我突然想到,我可能能够按组对数据框进行子集化,以某种方式在类别上聚合/连接字符串,然后使用 lapply() 和 intersect()... 类似
for(i in 1:nrow(data)[1]) {
data$matches[i] <- sum(intersect(subset(data, Group=="A")$Text_Strings[i],
subset(data, Group=="B")$Text_Strings[i]))
}
当然,这缺少步骤并且不起作用,但是我走在正确的轨道上吗?感谢您的帮助!
更新:jeremycg 的解决方案非常有用,但我的数据非常混乱,以至于它无法接受 parse()。感谢另一个线程中的另一个用户,我通过基于逗号分隔符拆分行而不是尝试直接取消嵌套来解决这个问题:
library(tidyverse)
x %>%
separate_rows(Text_Strings, sep = ",") %>% # split on commas
dmap_at("Text_Strings", ~ gsub("^c\\(\"|\")$|\"", "", .x))
这产生了相同的未嵌套数据,但更加更干净。
【问题讨论】:
标签: r