在 R 中,有没有一种方法可以计算一组 4 个值一起出现的次数,而组内值的顺序无关紧要?

In R, is there a way to count the number of times a group of 4 values occurred together where the order of the values within the group doesn't matter?

让我解释一下。我可以访问我试图从中得出结论的已清理数据。假设我正在分析博客 post 标签。例如,这里有一个标签列表

words <- c("book", "car", "coffee", "lamp",  "phone", "blue", "goat")

现在对于此博客 post 您必须使用 4 个标签;不多也不少,你不能重复标签。一段时间后,我们注意到这些标签附加到博客的独立概率 post 是

prob <- c(.90, .34, .50, .29, .60, .05, .10)

(假设概率有效)。

我使用以下内容模拟了 4 个博客标签的 1000 次试验

    results <- data.frame(trial = 1:1000, tag1 = NA, tag2 = NA, tag3 = NA, tag4 = NA)
for (i in 1:nrow(results)) {
    results[i, 2:5] <- sample(words, 4, prob = prob)
}

然后使用 pivot_longer 将数据转换为更长的格式

trial move       
<int> <chr>      
1 book    
1 car
1 lamp
1 goat
2 coffee
2 car
2 book     
2 lamp  
3 lamp
3 phone 

所以在试验 1 中,模拟博客有标签(书、汽车、lamp、山羊),试验 2 有(咖啡、汽车、书、lamp)等。

在 R 中有没有一种方法可以计算一组 4 个博客标签出现的次数,顺序无关紧要?

即(book, car, lamp, goat) 和 (car, book, goat, lamp) 不会分开计算。

我的目标是找到标签的模拟分布。

一个选项是按顺序比较 (==) 列与每个对应的元素 ('book'、'car'、'lamp'、'goat'), Reduce 使用 & 将其转换为单个逻辑向量,即仅当单行具有相同顺序的元素时才会 return TRUE),使用 [=15 获取计数=] 在逻辑上 vector

sum(Reduce(`&`, Map(`==`, results[-1], c('book', 'car', 'lamp', 'goat'))))
sum(Reduce(`&`, Map(`==`, results[-1], c('coffee', 'car', 'book', 'lamp'))))

base R 中为所有组执行此操作

out <- table(do.call(paste, results[-1]))

这是我的尝试似乎工作正常

library(tidyverse)

words <- c("book", "car", "coffee", "lamp",  "phone", "blue", "goat")
prob <- c(.90, .34, .50, .29, .60, .05, .10)

results <- data.frame(trial = 1:1000, tag1 = NA, tag2 = NA, tag3 = NA, tag4 = NA)
for (i in 1:nrow(results)) {
  results[i, 2:5] <- sample(words, 4, prob = prob)
}

results_to_token <- results %>% 
  unite("text",-trial,sep = ":") %>% 
  as_tibble()

function_to_use <- function(text_to_use){
  
  str_split(text_to_use,pattern = ":")[[1]] %>% 
    sort() %>% 
    reduce(str_c,sep = " ")
  
  
}

results_to_token_sorted <- results_to_token %>% 
  mutate(sorted_text =  map_chr(text,function_to_use))

results_to_token_sorted %>% 
  count(sorted_text)

# A tibble: 32 x 2
   sorted_text                n
   <chr>                  <int>
 1 blue book car coffee      22
 2 blue book car goat         4
 3 blue book car lamp         5
 4 blue book car phone       14
 5 blue book coffee goat      4
 6 blue book coffee lamp      8
 7 blue book coffee phone    21
 8 blue book goat lamp        3
 9 blue book goat phone       7
10 blue book lamp phone      13
# ... with 22 more rows