簡體   English   中英

按類別比較組之間的字符串匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM