有没有一种简单的方法来按列获取频率?
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))
我有一个李克特值列表,值范围从 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))