首页 > 解决方案 > 如何计算 R 中每列值的频率组合?

问题描述

在原始数据集中,我有 3k+ 行和 2 列 - id 和可以在实践中应用的语言。我的第一步是找到所选语言的频率组合。例如,有多少次 Python 与 R、SQL 一起被选择;或者 Java 被 JavaScript、C++ 等选择了多少次。

对 Stackoverflow 的一些研究帮助我找到了这些可能的模式。这是一些带有示例数据集的代码:

sample <- data.frame(id = rep(randomNames::randomNames(4), each = 4),
                     programming = c("R", "Python", "C#", "Other",
                                     "R", "Tableu", "Assembler",
                                     "Other", "Java", "JavaScript",
                                     "Python", "C#","R", "Python", "C#",
                                     "Other"))
gr <- sample %>%
  group_by(id) %>%
  arrange(programming) %>%
  summarise(programming = paste(sort(unique(programming)), collapse = ", ")) %>%
  count(programming)

但现在我想知道如何找到每种语言最频繁选择的数量。例如,R 语言很少与 Java 和 Kotlin 一起使用,这不是一个非常流行的设置。但是与 Python 和 SQL 一起选择的 R 更受欢迎。我的目的是找出哪些语言被选中的频率最高。

我也做了一些研究(例子),不幸的是,还没有找到解决方案。

我想我应该迭代我的programming专栏以找到所有可能的选择(R + ...,Python + ...;然后是 R + Python + ...)。我尝试使用lapply但在编写 lambda 函数时遇到了困难。

解决问题的可能方法是什么?是否有任何有效功能可用于此类目的?

标签: riteration

解决方案


一种选择是在每种语言中创建语言组合id以及count最常一起出现的组合。.

library(dplyr)

sample %>%
  group_by(id) %>%
  summarise(programming = combn(sort(programming), 2, 
                                paste0, collapse = '-'), .groups = 'drop') %>%
  count(programming, sort = TRUE)

#   programming           n
#   <chr>             <int>
# 1 C#-Python             3
# 2 Other-R               3
# 3 C#-Other              2
# 4 C#-R                  2
# 5 Other-Python          2
# 6 Python-R              2
# 7 Assembler-Other       1
# 8 Assembler-R           1
# 9 Assembler-Tableu      1
#10 C#-Java               1
#11 C#-JavaScript         1
#12 Java-JavaScript       1
#13 Java-Python           1
#14 JavaScript-Python     1
#15 Other-Tableu          1
#16 R-Tableu              1

推荐阅读