0

我有一个李克特值列表,值范围从 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

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

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

- 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),但我无法将其放入表格中以进一步使用。

谢谢!

4

3 回答 3

0

您可以tablesapply-

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))))
于 2021-10-07T13:22:17.490 回答
0

这应该这样做,使用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
于 2021-10-07T13:23:25.473 回答
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))
于 2021-10-07T17:07:57.660 回答