如何计算 R 中交叉 table 中的出现次数?

How to count Occurrences in a cross table in R?

我如何在 R (RStudio) 中创建一个交叉 table,我在其中计算出现次数。

我有这个示例输入:

Technology <- c("A", "A", "B", "C", "C", "C")
Development <- c(1, 0, 1, 1, 1, 1)
Production <- c(1, 1, 0, 0, 0, 1)
Sales <- c(0, 0, 1, 1, 0, 1)
DF <- data.frame(Technology, Development, Production, Sales)

我想知道在哪个领域最常使用哪种技术。

结果应该如图所示。

这些问题很多时候是数据格式问题,解决方法是先从宽格式重塑为长格式,参见this question


这是 reshape 的基础 R 解决方案和 xtabs 的交叉制表。

Technology <- c("A", "A", "B", "C", "C", "C")
Development <- c(1, 0, 1, 1, 1, 1)
Production <- c(1, 1, 0, 0, 0, 1)
Sales <- c(0, 0, 1, 1, 0, 1)
DF <- data.frame(Technology, Development, Production, Sales)

reshape(
  DF,
  direction = "long",
  varying = list(names(DF[-1])),
  v.names = "Active",
  times = names(DF[-1]),
  timevar = "Phase"
) |>
  (\(x) xtabs(Active ~ Phase + Technology, x))()
#>              Technology
#> Phase         A B C
#>   Development 1 1 3
#>   Production  2 0 1
#>   Sales       0 1 2

reprex package (v2.0.1)

于 2022-04-18 创建

还有一个tidyverse解决方案。

suppressPackageStartupMessages({
  library(magrittr)
  library(tidyr)
})

DF %>%
  pivot_longer(-Technology) %>%
  xtabs(value ~ name + Technology, .)
#>              Technology
#> name          A B C
#>   Development 1 1 3
#>   Production  2 0 1
#>   Sales       0 1 2

reprex package (v2.0.1)

于 2022-04-18 创建

这里有一个 tidyverse 方法,以获得您想要的输出:

  1. 我们按技术分组总结为across
  2. 然后我们用 paste 准备行名并从 tibble
  3. 应用 column_to_rownames
  4. 终于可以用t()
  5. 进行改造了
library(dplyr)
library(tibble)
DF %>% 
  group_by(Technology) %>% 
  summarise(across(c(Development, Production, Sales), sum)) %>% 
  mutate(Technology = paste("Technology", Technology, sep = " ")) %>% 
  column_to_rownames("Technology") %>% 
  t()
            Technology A Technology B Technology C
Development            1            1            3
Production             2            0            1
Sales                  0            1            2

既然你要求交叉表,你也可以使用包 crosstable:

library(crosstable)
crosstable(DF, by=Technology)%>% 
  as_flextable()

但是,在您的情况下,您不关心比例,只需要每个变量为 1 时的数字,因此您可能需要 运行:

library(dplyr)
crosstable(DF, by=Technology, percent_pattern="{n}") %>% 
    filter(variable==1) %>% select(-variable) %>% 
    as_flextable()

有关包裹的更多信息,请访问 https://danchaltiel.github.io/crosstable/