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

标签 r dataframe function loops dplyr

我有一个数据框(标题为 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 reshape 为“长”格式,然后使用 pivot_wider reshape 为“宽”格式,同时将 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"))

关于r - 如何在 R 中构建一次汇总多个值的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68747837/

相关文章:

JavaScript 如何发送不同的实体但保持相同的 ID?

r - 如何在嵌套的 lapply/sapply 函数中附加值?

r - 为什么在 R 中重新编码不会改变原始值?

scala - Apache Spark,将 “CASE WHEN … ELSE …”计算列添加到现有DataFrame中

python - 如何从文本文件创建数据框

function - 修改 Swift 本身

r - 在ggplot2中的 map 上以一定半径绘制圆

javascript - 有人可以用简单的英语解释迭代参数在 sankeyNetwork() 中的含义吗?

python - Pandas:如何正确执行 df2 中的行 = df1 中的列?

c++ - 当返回对象的函数在没有返回语句的情况下结束时会发生什么