有没有一种简单的方法来按列获取频率?

Is there an easy way to get the frequencies column wise?

我有一个李克特值列表,值范围从 1 到 5。每列可能出现一次、多次或根本不出现每个可能的响应。我有几列和几行,每一行对应一个参与者,每一列对应一个问题。没有 NA 数据。

示例:

c1 c2 c3
1 1 5
2 2 5
3 3 4
3 4 3
2 5 1
1 3 1
1 5 1

目标是逐列计算答案选项的频率,从而比较它们。

所以结果 table 应该是这样的:

- c1 c2 c3
1 3 1 3
2 2 1 0
3 2 2 1
4 0 1 1
5 0 2 2

我知道如何为一列执行此操作,我可以使用 apply(ds, 1, table) 查看频率,但我无法将其放入 table 以进一步处理。

谢谢!

您可以在 sapply -

中使用 table
sapply(df, function(x) table(factor(x, 1:5)))

#  c1 c2 c3
#1  3  1  3
#2  2  1  0
#3  2  2  1
#4  0  1  1
#5  0  2  2

如果您愿意,这种方法也可以用于 dplyr

library(dplyr)
df %>% summarise(across(.fns = ~table(factor(., 1:5))))

这应该可以做到,使用 plyr:

count_df = setNames(data.frame(t(plyr::ldply(apply(df, 2, table), rbind)[2:6])), colnames(df))

count_df[is.na(count_df)] = 0

我们可以在 base R

中使用矢量化选项
table(data.frame(v1 = unlist(df1), v2 = names(df1)[col(df1)]))
   v2
v1  c1 c2 c3
  1  3  1  3
  2  2  1  0
  3  2  2  1
  4  0  1  1
  5  0  2  2

数据

df1 <- structure(list(c1 = c(1L, 2L, 3L, 3L, 2L, 1L, 1L), c2 = c(1L, 
2L, 3L, 4L, 5L, 3L, 5L), c3 = c(5L, 5L, 4L, 3L, 1L, 1L, 1L)),
 class = "data.frame", row.names = c(NA, 
-7L))