计算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包含以下表格:

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

最新更新