繁体   English   中英

R 多列频率表,按第三个变量分组

[英]R Frequency table of multiple columns, grouped by third variable

我有一个看起来像这样的数据表,其中包含属于一起的“组”列:

  • 第 1 组:Q1_1、Q1_2、Q1_3
  • 第 2 组:Q2_1、Q2_2
 ID Sex  Q1_1 Q1_2 Q1_3 Q2_1 Q2_2 
 1   m    2     5    2    4    4
 2   f    4     5    1    3    1
 3   m    5     4    4    5    5
 4   f    2     4    3    5    4

首先,我想计算该组列中所有行中出现的所有值,并从中创建一个新的数据表,如下所示:

 answer  freq_Q1_all  freq_Q2_all 
    1         1            1
    2         3            0
    3         1            1
    4         4            3
    5         3            3

最后,我想创建一个类似的数据表,但由Sex列的变量分隔。

 answer  freq_Q1_all_f  freq_Q1_all_m  freq_Q2_all_f  freq_Q2_all_m
    1         1              0               1               0
    2         1              2               0               0
    3         1              0               1               0
    4         2              2               1               2
    5         2              1               1               2             

任何帮助深表感谢。 谢谢!

使用tidyverse

第一个问题:

library(tidyverse)

dat %>%
    pivot_longer(cols = starts_with("Q"), values_to = "answer") %>%
    separate(name, into = c("question", "question2")) %>%
    count(question, answer) %>%
    pivot_wider(names_from = question, values_from = n) %>%
    mutate_if(is.numeric, replace_na, 0)

  answer    Q1    Q2
   <dbl> <dbl> <dbl>
1      1     1     1
2      2     3     0
3      3     1     1
4      4     4     3
5      5     3     3

第二个问题:

dat %>%
    pivot_longer(cols = starts_with("Q"), values_to = 'answer') %>%
    separate(name, into = c("question", "question2")) %>%
    count(Sex, question, answer)  %>%
    unite(question, question, Sex, sep = "_") %>%
    pivot_wider(names_from = question, values_from = n) %>%
    mutate_if(is.numeric, replace_na, 0)

  answer  Q1_f  Q2_f  Q1_m  Q2_m
   <dbl> <dbl> <dbl> <dbl> <dbl>
1      1     1     1     0     0
2      2     1     0     2     0
3      3     1     1     0     0
4      4     2     1     2     2
5      5     1     1     2     2

为此您需要做的主要工作就是重塑数据,这就是我们使用pivot_longer (也可以使用gather)和pivot_wider (也可以使用spread)的地方。 separateunite帮助我们清理需要分离( Q1_1 -> Q1 , 1 )和联合( Q1f -> Q1_f )的列。 从那里它只是一个小的数据清理。

如果您不熟悉这些功能,那么逐行执行代码可能会有所帮助。

数据

dat <- structure(list(ID = 1:4, 
                      Sex = c("m", "f", "m", "f"), 
                      Q1_1 = c(2L, 4L, 5L, 2L), 
                      Q1_2 = c(5L, 5L, 4L, 4L), 
                      Q1_3 = c(2L, 1L, 4L, 3L), 
                      Q2_1 = c(4L, 3L, 5L, 5L), 
                      Q2_2 = c(4L, 1L, 5L, 4L)), 
                 class = "data.frame", 
                 row.names = c(NA, -4L))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM