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

  • 本文关键字:三个 变量 频率 r
  • 更新时间 :
  • 英文 :


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

  • 第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

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

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(也可以使用收集(和pivot_wider(也可以使用传播(的地方。separateunite帮助我们清理需要分开的列(Q1_1->Q11(和联合(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))

相关内容

最新更新