[英]Comparing string matches between groups by category
我有以下形式的大型數據集,具有從語料庫中提取的文本字符串:
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))
這產生了相同的未嵌套數據,但更加干凈。
您可以使用dplyr和tidyr:
library(dplyr)
library(tidyr)
x %>% unnest() %>% #spread out the nested columns
distinct() %>% #remove dupes
group_by(Category) %>% #by Category
summarise(out = sum(Text_Strings[Group == 'A'] %in% Text_Strings[Group == 'B'])) #sum the overlap
給予:
Source: local data frame [3 x 2]
Category out
(int) (int)
1 1 2
2 2 0
3 3 3
您的實際數據非常混亂-您應該嘗試修復將其輸出為“長格式”的任何內容。 這是一個笨拙的修復程序:
x$listcites = gsub('\\\\n', '',x$listcites) #remove newlines
x$listcites = gsub("\"", "'", x$listcites, fixed = TRUE) #remove quotes to singles
x$listcites[grepl('^[^c]',x$listcites)] = paste("c('", x$listcites[grepl('^[^c]',x$listcites)],"')", sep = '') #fix single lines to same format
x$listcites = sapply(x$listcites, function(x) eval(parse(text = x))) #eval to vecs in dataframe
x %>% unnest() %>%
distinct %>%
group_by(case_num) %>%
summarise(out = sum(listcites[type == 'claimant'] %in% listcites[type == 'court'])) #sum the overlap
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.