【问题标题】:R Frequency table of multiple columns, grouped by third variableR 多列的频率表,按第三个变量分组
【发布时间】:2020-05-12 12:43:50
【问题描述】:

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

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

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    使用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)的地方。 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))
    

    【讨论】:

    • 谢谢!有用。只是为了我的理解:separate 究竟是如何工作的?您在哪里定义对象name 以及名称“question”和“question2”出现在哪里?
    • name 来自pivot_longer 的结果。 question 和question2 将在执行separate 后在data.frame 中。您可能希望逐一查看执行语句以查看“内部”操作
    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多