在 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
让我解释一下。我可以访问我试图从中得出结论的已清理数据。假设我正在分析博客 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