如何计算 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
方法,以获得您想要的输出:
- 我们按技术分组总结为
across
- 然后我们用
paste
准备行名并从 tibble
应用 column_to_rownames
- 终于可以用
t()
进行改造了
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/。
我如何在 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
方法,以获得您想要的输出:
- 我们按技术分组总结为
across
- 然后我们用
paste
准备行名并从tibble
应用 - 终于可以用
t()
进行改造了
column_to_rownames
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/。