我有一个数据表,看起来像这样,其中列的"组"属于一起:
- 第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
(也可以使用传播(的地方。separate
和unite
帮助我们清理需要分开的列(Q1_1
->Q1
,1
(和联合(Q1
,f
->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))