如何在r中构建一次汇总多个值的表



我有一个数据框架(标题为df1)与多个列,包含是,否或NA的答案。

A    B   C    D
1  Yes   No  No  Yes
2  Yes   No  No   No
3 <NA>  Yes Yes <NA>
4   No <NA>  No  Yes

我的目标是创建一个表,计算每个答案的频率,并输出一个具有原始列名的表,如下所示:

Answer A B C D
1    Yes 2 1 1 2
2     No 1 2 3 1
3   <NA> 1 1 0 1

到目前为止,我的方法是构建一个函数,然后循环遍历该函数,但输出并没有产生一个包含所有类别(a到D)的表。

my_function <- function(table_name,col_name) {
table_name %>% 
group_by_(Answer = col_name) %>%
summarise(!!paste0(col_name):= n())}
my_categories <- c("A","B","C","D")
for(i in 1:length(my_categories)){
df2 <- myfunction(df1,CSAT_Cols[i])
}

如果有更简单的方法,我也可以采用不同的方法,但是TL:DR,尝试通过多个类别进行分组,通过n()进行汇总,然后创建包含所有数据的单个表。

我们可以用pivot_longer重塑为'长'格式,然后用pivot_wider重塑为'宽'格式,同时在不同的列上将values_fn指定为length

library(dplyr)
library(tidyr)
df1 %>% 
pivot_longer(cols = everything(), values_to = 'Answer') %>% 
pivot_wider(names_from = name, values_from = name, 
values_fn = length, values_fill = 0)

输出

# A tibble: 3 x 5
Answer     A     B     C     D
<chr>  <int> <int> <int> <int>
1 Yes        2     1     1     2
2 No         1     2     3     1
3 <NA>       1     1     0     1

数据
df1 <- structure(list(A = c("Yes", "Yes", NA, "No"), B = c("No", "No", 
"Yes", NA), C = c("No", "No", "Yes", "No"), D = c("Yes", "No", 
NA, "Yes")), class = "data.frame", row.names = c("1", "2", "3", 
"4"))

也许使用table的基础R选项可以帮助您

> table(unlist(df), names(df)[col(df)], useNA = "ifany")
A B C D
No   1 2 3 1
Yes  2 1 1 2
<NA> 1 1 0 1

最新更新