计算 R 中几个分类变量的频率
Counting the frequency of several categorical variables in R
我需要创建一个数据框,其中包含来自先前数据框的每个分类变量的频率。幸运的是,这些变量都是由数字构成的,从 1 到 5,而不是文本。
因此,我可以创建一个新的数据框,其中第一列包含数字 1 到 5,接下来的每一列都计算该数字的频率作为原始数据框中每个变量的响应。
比如我们有一个原始的df定义为:
df1 <- data.frame(
Z = c(4, 1, 2, 1, 5, 4, 2, 5, 1, 5),
Y = c(5, 1, 5, 5, 2, 1, 4, 1, 3, 3),
X = c(4, 2, 2, 1, 5, 1, 5, 1, 3, 2),
W = c(2, 1, 4, 2, 3, 2, 4, 2, 1, 2),
V = c(5, 1, 3, 3, 3, 3, 2, 4, 4, 1))
我需要第二个包含以下内容的 df table:
fq Z Y X W V
1 3 3 3 2 2
2 4 2 6 10 2
3 0 6 3 3 12
4 8 4 4 8 8
5 15 15 10 0 5
我看到了一些关于如何使用 plyr 做这样的事情的答案,但不是以系统的方式。有人可以帮我吗?
table(stack(df1)) * 1:5
ind
values Z Y X W V
1 3 3 3 2 2
2 4 2 6 10 2
3 0 6 3 3 12
4 8 4 4 8 8
5 15 15 10 0 5
如果你需要data.frame,你可以这样做:
as.data.frame.matrix(table(stack(df1)) * 1:5)
我们可以使用
sapply(df1, function(x) tapply(x, factor(x, levels = 1:5), FUN = sum))
Z Y X W V
1 3 3 3 2 2
2 4 2 6 10 2
3 NA 6 3 3 12
4 8 4 4 8 8
5 15 15 10 NA 5
另一种可能的解决方案,基于purrr::map_dfc
:
library(tidyverse)
map_dfc(df1, ~ 1:5 * table(factor(.x, levels = 1:5)) %>% as.vector)
#> # A tibble: 5 × 5
#> Z Y X W V
#> <int> <int> <int> <int> <int>
#> 1 3 3 3 2 2
#> 2 4 2 6 10 2
#> 3 0 6 3 3 12
#> 4 8 4 4 8 8
#> 5 15 15 10 0 5
我需要创建一个数据框,其中包含来自先前数据框的每个分类变量的频率。幸运的是,这些变量都是由数字构成的,从 1 到 5,而不是文本。
因此,我可以创建一个新的数据框,其中第一列包含数字 1 到 5,接下来的每一列都计算该数字的频率作为原始数据框中每个变量的响应。
比如我们有一个原始的df定义为:
df1 <- data.frame(
Z = c(4, 1, 2, 1, 5, 4, 2, 5, 1, 5),
Y = c(5, 1, 5, 5, 2, 1, 4, 1, 3, 3),
X = c(4, 2, 2, 1, 5, 1, 5, 1, 3, 2),
W = c(2, 1, 4, 2, 3, 2, 4, 2, 1, 2),
V = c(5, 1, 3, 3, 3, 3, 2, 4, 4, 1))
我需要第二个包含以下内容的 df table:
fq Z Y X W V
1 3 3 3 2 2
2 4 2 6 10 2
3 0 6 3 3 12
4 8 4 4 8 8
5 15 15 10 0 5
我看到了一些关于如何使用 plyr 做这样的事情的答案,但不是以系统的方式。有人可以帮我吗?
table(stack(df1)) * 1:5
ind
values Z Y X W V
1 3 3 3 2 2
2 4 2 6 10 2
3 0 6 3 3 12
4 8 4 4 8 8
5 15 15 10 0 5
如果你需要data.frame,你可以这样做:
as.data.frame.matrix(table(stack(df1)) * 1:5)
我们可以使用
sapply(df1, function(x) tapply(x, factor(x, levels = 1:5), FUN = sum))
Z Y X W V
1 3 3 3 2 2
2 4 2 6 10 2
3 NA 6 3 3 12
4 8 4 4 8 8
5 15 15 10 NA 5
另一种可能的解决方案,基于purrr::map_dfc
:
library(tidyverse)
map_dfc(df1, ~ 1:5 * table(factor(.x, levels = 1:5)) %>% as.vector)
#> # A tibble: 5 × 5
#> Z Y X W V
#> <int> <int> <int> <int> <int>
#> 1 3 3 3 2 2
#> 2 4 2 6 10 2
#> 3 0 6 3 3 12
#> 4 8 4 4 8 8
#> 5 15 15 10 0 5