我需要创建一个数据帧,其中包含来自前一个数据帧的每个分类变量的频率。幸运的是,这些变量都是由数字组成的,从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